首页 > 解决方案 > TextView.setOnClickListener 没有移动到新活动

问题描述

因此,我正在尝试学习如何制作类似 Instagram 的应用程序。

我创建了登录和注册活动。

我现在的问题是我有一个应该可以点击的文本视图并将我切换到不同的活动。

sign_up_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
            Intent signUpIntent = new Intent(LoginActivity.this, RegistrationActivity.class);
            startActivity(signUpIntent);
        }
    });

这段代码应该将我切换到 RegistrationActivity 但是当我点击 textview 时它会闪烁屏幕但停留在登录页面上。然后,当我再次单击 textview 时,它会使应用程序崩溃并给我这个错误。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at com.ssmc.instagram.RegistrationActivity.onCreate(RegistrationActivity.java:58)

错误是指注册活动中的这段代码。

signing_up_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            register();
        }
    });

但这是用于注册帐户的按钮。但在应用程序中,xml 页面仍然是登录活动,它没有更改为注册活动。

编辑: sign_up_btn 变量是这样的:

sign_up_btn = (TextView) findViewById(R.id.sign_up_btn);

Edit2:有些人要求查看活动的 xml 视图文件。所以他们在这里。

活动登录.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/login_container"
    android:padding="40dp"
    android:background="@drawable/animation_color"
    tools:context=".LoginActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:src="@drawable/instagram_logo"
        android:layout_marginBottom="40dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Username"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_profile"
        android:inputType="textPersonName"
        android:id="@+id/login_user_name"
        android:drawablePadding="10dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Password"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_lock"
        android:inputType="textPassword"
        android:id="@+id/login_password"
        android:drawablePadding="10dp" />
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:id="@+id/login_btn"
        android:text="@string/log_in"
        android:textColor="#cccccc"
        android:background="@color/colorPurple"
        android:textAllCaps="false"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="16dp"
        android:text="Not a member, Sign up now!"
        android:textColor="#ffffff"
        android:textSize="16dp"
        android:id="@+id/sign_up_btn" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="16dp"
        android:text="Forgot Password?"
        android:textColor="#ffffff"
        android:textSize="16dp"
        android:id="@+id/forgot_pass_btn"/>


</LinearLayout>

和activity_registration.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/login_container"
    android:padding="40dp"
    android:background="@drawable/animation_color"
    tools:context=".LoginActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:src="@drawable/instagram_logo"
        android:layout_marginBottom="40dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Email"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_email"
        android:inputType="textPersonName"
        android:id="@+id/register_user_email"
        android:drawablePadding="10dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Username"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_profile"
        android:inputType="textPersonName"
        android:id="@+id/register_user_name"
        android:drawablePadding="10dp"/>


    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Password"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_lock"
        android:inputType="textPassword"
        android:id="@+id/register_password"
        android:drawablePadding="10dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="Confirm Password"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        android:backgroundTint="#fff"
        android:drawableLeft="@drawable/ic_lock"
        android:inputType="textPassword"
        android:id="@+id/register_password_confirm"
        android:drawablePadding="10dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:id="@+id/signing_up_btn"
        android:text="Sign Up"
        android:textColor="#cccccc"
        android:background="@color/colorPurple"
        android:textAllCaps="false"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="16dp"
        android:text="Already have an Account?"
        android:textColor="#ffffff"
        android:textSize="16dp"
        android:id="@+id/go_to_login_btn"/>

</LinearLayout>

Edit3:这是 LoginActivity 的主要代码:

public class LoginActivity extends AppCompatActivity {

    LinearLayout mLoginContainer;
    AnimationDrawable mAnimationDrawable;

    EditText username_et, password_et;
    ProgressDialog mProgressDialog;
    Button login_btn;

    TextView sign_up_btn, forgot_pass_btn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mLoginContainer = (LinearLayout) findViewById(R.id.login_container);
        mAnimationDrawable = (AnimationDrawable) mLoginContainer.getBackground();
        mAnimationDrawable.setEnterFadeDuration(5000);
        mAnimationDrawable.setExitFadeDuration(2000);

        username_et = (EditText) findViewById(R.id.login_user_name);
        password_et = (EditText) findViewById(R.id.login_password);
        mProgressDialog = new ProgressDialog(this);
        login_btn = (Button) findViewById(R.id.login_btn);

        sign_up_btn = (TextView) findViewById(R.id.sign_up_btn);
        forgot_pass_btn = (TextView) findViewById(R.id.forgot_pass_btn);

        login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LogIn();
            }
        });

        sign_up_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent signUpIntent = new Intent(LoginActivity.this, RegistrationActivity.class);
                signUpIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(signUpIntent);
            }
        });

        forgot_pass_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
            }
        });

    }
}

这是RegistrationActivity的代码:

public class RegistrationActivity extends AppCompatActivity {

    LinearLayout mRegistrationContainer;
    AnimationDrawable mAnimationDrawable;

    EditText user_email_et, user_name_et, password_et, password_confirm_et;
    ProgressDialog mProgressDialog;
    Button signing_up_btn;
    TextView go_to_login_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mRegistrationContainer = (LinearLayout) findViewById(R.id.login_container);
        mAnimationDrawable = (AnimationDrawable) mRegistrationContainer.getBackground();
        mAnimationDrawable.setEnterFadeDuration(5000);
        mAnimationDrawable.setExitFadeDuration(2000);

        user_email_et = (EditText) findViewById(R.id.register_user_email);
        user_name_et = (EditText) findViewById(R.id.register_user_name);
        password_et = (EditText) findViewById(R.id.register_password);
        password_confirm_et = (EditText) findViewById(R.id.register_password_confirm);
        mProgressDialog = new ProgressDialog(this);
        signing_up_btn = (Button) findViewById(R.id.signing_up_btn);
        go_to_login_btn = (TextView) findViewById(R.id.go_to_login_btn);

        signing_up_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                register();
            }
        });

        go_to_login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
                startActivity(new Intent(RegistrationActivity.this, LoginActivity.class));
            }
        });

    }

}

标签: javaandroidandroid-activity

解决方案


你的问题很清楚。RegistrationActivity启动。但是,在RegistrationActivity.onCreate()你这样做:

setContentView(R.layout.activity_login);

因此,您正在使用来自的布局 XML 文件,LoginActivity而不是来自RegistrationActivity. 这就是屏​​幕“闪烁”但似乎没有变化的原因。它正在改变,但布局与以前的相同Activity。它还解释了调用setOnClickListener()失败的原因,因为您使用了错误的布局 XML 文件。


推荐阅读