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

这是一个基本的活动交换。


如果我在 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();

            }

        });

    }


}


呼唤远方
浏览 108回答 4
4回答

青春有我

您需要在调用 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();    }  });}

侃侃无极

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

温温酱

我猜试试)在你的// 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),一切都会正常工作。

三国纷争

voiceBtn = (Button) findViewById(R.id.goToVoice);用上面的替换你的onCreate()方法中的语句。它应该工作。并使用super.finish() instead of finish()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java