Android setOnClickListener 使我的应用程序在 avd 上崩溃

Android setOnClickListener crashes my app on avd

我是 android 开发新手,我使用 NavigationDrawer activity 创建了一个新项目,我使用 Android Studio。问题是当我添加一个按钮并创建 OnClickListener 时,应用程序崩溃了,但没有它,它可以正常启动。请看下面我的代码。
我尝试添加 setContentView(View) 但没有帮助

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); //comes by default
    setContentView(R.layout.fragment_main); //added by me, but doesnt help

    //referencing my button
    btnTest =  (Button)findViewById(R.id.btnTest);

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));

    //my event listeners
    //when i highlight the below code everythin works..these block cause the crash
     btnTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });


}

我知道其他人遇到过这些问题并解决了,但我的解决不了,请帮忙,谢谢

没有Logcat我会说你的问题是以下之一:

  1. btnTest 未在您的 ActivityLayout (activity_main) 中定义。如果是这种情况,请检查您的 XML。

  2. 你的btnTest在你的Fragment里面吗?如果是这样,你应该把 OnClickListener 放在你的 Fragment class 而不是你的 Activity class.

顺便说一句,第二个 setContentView 没有任何意义,你应该只使用一个。

希望对您有所帮助

setContentView(R.layout.activity_main); //comes by default
setContentView(R.layout.fragment_main); //added by me, but doesnt help

不要调用 setContentView 两次。 "comes by default"是为了方便IDE在生成Activityclass的时候提供的,如果不需要就删掉。

其次,您将 Activity 的片段布局设置为 View。因此,除非 R.id.btnTest 包含在该布局中,否则 btnTest 将为空,因此在调用 setOnClickListener.

时会导致 NullPointerException

删除这个:

setContentView(R.layout.fragment_main);

这里

setContentView(R.layout.activity_main); 

确保您的 Activity 有一个名为 activity_main.xml 的布局文件,或者将该引用替换为您的布局文件的名称。

EDIT :我猜你选择了 AS 中的选项来在你的 Activity 中生成一个占位符和一个要添加到它的片段。您需要处理 Fragment class 中的按钮,更重要的是,您需要将 Fragment 添加到您的 Activity 中。

在您的 Activity 中(在 OnCreate 中,在设置导航抽屉之后):

Fragment newFragment = new ExampleFragment(); // replace ExampleFragment by your Fragment's class name
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(CONTENT_VIEW_ID, newFragment).commit(); // CONTENT_VIEW_ID is the id of the View in your Activity that should contain the Fragment.

然后在您的 Fragment 中,将其移至 onActivityCreated :

btnTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
});

您将需要在 Fragment 中将 R.layout.fragment_main inflate onCreateView,并从您 inflate 的 View 中获取对 btnTest 的引用。