为了账号安全,请及时绑定邮箱和手机立即绑定

尝试交换活动时应用程序崩溃

尝试交换活动时应用程序崩溃

呼唤远方 2022-12-21 14:43:05
这是一个基本的活动交换。如果我在 configureActivitySwap() 方法中声明一个本地按钮,应用程序不会崩溃,如下所示:Button voiceBtn = (findViewById(R.id.goToVoice));但是我必须在全局范围内声明按钮,这样我就可以在其他方法中使用按钮,主要是在应该/不应该按下按钮时激活和停用按钮。我还注意到,如果我删除该finish();方法并将其替换为其他应用程序正常运行的方法,但我必须以finish();某种方式使用该方法。public class RecogActivity extends AppCompatActivity {    private Button voiceBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        voiceBtn = findViewById(R.id.goToVoice);        setContentView(R.layout.main_layout);        // some unrelated code        configureActivitySwap();    }    public void configureActivitySwap(){        // Button voiceBtn = (findViewById(R.id.goToVoice));        voiceBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                finish();            }        });    }}
查看完整描述

4 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

您需要在调用 voiceBtn = findViewById(R.id.goToVoice) 之前调用 setContentView(); 由于您未指定布局,因此 findViewById 方法将不会获取按钮实例


public class RecogActivity extends AppCompatActivity {


   private Button voiceBtn;


   @Override

   protected void onCreate(Bundle savedInstanceState) {


      super.onCreate(savedInstanceState);

      // set the layout first

      setContentView(R.layout.YOUR_LAYOUT_XML_FILE_NAME)


      voiceBtn = findViewById(R.id.goToVoice);


      // some unrelated code


      configureActivitySwap();

 }


 public void configureActivitySwap(){

    // Button voiceBtn = (findViewById(R.id.goToVoice));


    voiceBtn.setOnClickListener(new View.OnClickListener() {


    @Override

    public void onClick(View view) {

        finish();

    }

  });

}


查看完整回答
反对 回复 2022-12-21
?
侃侃无极

TA贡献2051条经验 获得超10个赞

您是否在尝试使用 findViewById 查找视图之前设置布局?setContentView(R.layout.main_layout);



查看完整回答
反对 回复 2022-12-21
?
温温酱

TA贡献1752条经验 获得超4个赞

我猜试试)在你的// some unrelated codeis containssetContentView方法中?


public class RecogActivity extends AppCompatActivity {


    private Button voiceBtn;


    @Override

    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);


        voiceBtn = findViewById(R.id.goToVoice);


        setContentView(R.layout.some_layout)

        // some unrelated code


        configureActivitySwap();

    }


    public void configureActivitySwap(){

        // Button voiceBtn = (findViewById(R.id.goToVoice));


        voiceBtn.setOnClickListener(new View.OnClickListener() {


            @Override

            public void onClick(View view) {

                finish();

            }

        });

    }


}

你抓到 NPE 是因为findViewById调用了膨胀的视图。在第一种情况下,你findViewById之前一直在打电话,但得到了例外。setContentView而在第二种情况下configureActivitySwap,那是追赶setContentView。setContentView之后移动super.onCreate(savedInstanceState),一切都会正常工作。


查看完整回答
反对 回复 2022-12-21
?
三国纷争

TA贡献1804条经验 获得超7个赞

voiceBtn = (Button) findViewById(R.id.goToVoice);

用上面的替换你的onCreate()方法中的语句。它应该工作。

并使用

super.finish() instead of finish()


查看完整回答
反对 回复 2022-12-21
  • 4 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信