无法使用 Intent 调用另一个活动

Posted

技术标签:

【中文标题】无法使用 Intent 调用另一个活动【英文标题】:Can't call another activity using Intent 【发布时间】:2018-03-02 09:08:56 【问题描述】:

我是 android 新手,只是想弄清楚如何使用 onActivityResult 方法。我想单击 mainActivity 上的按钮,转到另一个活动,输入名称并返回 mainActivity。但是我在运行应用程序时遇到了麻烦。我总是收到这个错误:

java.lang.NullPointerException: 尝试调用虚方法...

09-20 22:14:32.212 30617-30617/com.genaepic.p029_simpleactivityresult E/AndroidRuntime:

致命异常:主要 进程:com.genaepic.p029_simpleactivityresult,PID:30617 java.lang.RuntimeException:无法启动活动 组件信息com.genaepic.p029_simpleactivityresult/com.genaepic.p029_simpleactivityresult.NameActivity: java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:java.lang.NullPointerException:尝试调用虚拟 方法'无效 android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上 在 com.genaepic.p029_simpleactivityresult.NameActivity.onCreate(NameActivity.java:22) 在 android.app.Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

我的主要活动:

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

    TextView textView;
    Button button;


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

        textView = (TextView) findViewById(R.id.tv_main);
        button = (Button) findViewById(R.id.btn_iputName);
        button.setOnClickListener(this);
    

    @Override
    public void onClick(View v) 
        Intent intent = new Intent(this, NameActivity.class);
        startActivityForResult(intent, 1);
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        if(data == null) 
            return;
        
        String name = data.getStringExtra("name");
        textView.setText("Your name is " + name);
    

我的第二个活动:

public class NameActivity extends AppCompatActivity implements View.OnClickListener 

EditText editText;
Button button;

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

    editText = (EditText) findViewById(R.id.et_name);
    button = (Button) findViewById(R.id.btn_iputName);
    button.setOnClickListener(this);


@Override
public void onClick(View v) 
    Intent intent = new Intent();
    intent.putExtra("name", editText.getText().toString());
    setResult(RESULT_OK, intent);
    finish();

我的 mainActivity xml 代码:

<Button
    android:id="@+id/btn_iputName"
    android:layout_
    android:layout_
    android:text="input your name"
    tools:layout_constraintTop_creator="1"
    android:layout_marginStart="34dp"
    android:layout_marginTop="92dp"
    tools:layout_constraintLeft_creator="1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginLeft="34dp" />

<TextView
    android:id="@+id/tv_main"
    android:layout_
    android:layout_
    android:text="Your name is"
    tools:layout_constraintTop_creator="1"
    android:layout_marginStart="34dp"
    android:layout_marginTop="33dp"
    tools:layout_constraintLeft_creator="1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginLeft="34dp" />

我的 NameActivity xml 代码

 <Button
        android:id="@+id/btn_ok"
        android:layout_
        android:layout_
        android:layout_marginTop="116dp"
        android:text="ok"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1" />

    <EditText
        android:id="@+id/et_name"
        android:layout_
        android:layout_
        android:layout_marginEnd="64dp"
        android:layout_marginRight="84dp"
        android:layout_marginTop="31dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1" />
</android.support.constraint.ConstraintLayout>

【问题讨论】:

您可以使用其中一个旁边的复选标记来接受答案 【参考方案1】:

您在 NameActivity 中执行 setContentView(R.layout.activity_name),然后在另一个 Activity 中执行 button = (Button) findViewById(R.id.btn_iputName)

只是改变

button = (Button) findViewById(R.id.btn_iputName);

button = (Button) findViewById(R.id.btn_ok);

它会为你工作。

【讨论】:

感谢您的反馈。很有帮助【参考方案2】:

按钮使用了错误的 ID

在您的第二个活动中,即NameActivity.java 你需要更换

button = (Button) findViewById(R.id.btn_iputName);

button = (Button) findViewById(R.id.btn_ok);

这些更改将解决NullPointerException,您的应用将正常运行。

【讨论】:

【参考方案3】:

你有

setContentView(R.layout.activity_name)

所以改变这个

button = (Button) findViewById(R.id.btn_iputName)

button = (Button) findViewById(R.id.btn_ok);

findViewById 在当前视图层次结构中查找具有 id 的视图。所以如果你有setContentView(R.layout.activity_name),你应该在activity_name.xml 中查找id。

【讨论】:

【参考方案4】:

在 Your NameActivity 中没有 button = (Button) findViewById(R.id.btn_iputName);相反,它在 MainActivity 中,您在 NameActivity 中找到,因为在启动 Name 活动时它会给出 NullPointerException。

【讨论】:

以上是关于无法使用 Intent 调用另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

RadioButton Intent活动 - android

无法将小部件 ID 传递给配置活动

将多个 Intent 从单个 Activity 发送到另一个 Activity

启动模式 Singletop 无法使用权​​限对话框显示

无法使用序列化android发送现有对象

使用“singleTask”作为启动模式时无法完全关闭活动