使用'findViewById'从其他布局访问小部件将返回null

时间:2019-04-19 12:37:18

标签: java android android-layout android-widget

我正在尝试获取Switch小部件的状态。为此,我创建了一个新变量,如下所示: Switch notifSwitch = findViewById(R.id.notif_switch)

但是这不起作用,因为现在notifSwitchnull,并且强制转换setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()给了我java.lang.NullPointerException

我怀疑这与以下事实有关:ID为'notif_switch'的小部件(我尝试获取其值的Switch)不是(直接)在{{ 1}},这是我在activity_main.xml方法开始时传递给setContentView的布局,因为如果我在onCreate声明之前添加setContentView(R.layout.line_notif);,则代码可以正常工作。该应用仅包含Switch布局中的内容,仅包含line_notif.xmlSwitch,但至少我没有任何错误,并且能够获取TextView小部件的状态。

我不知道如何从我的Switch文件访问窗口小部件,并且找不到解决方法。在制作自己的文章之前,我尝试过查找尽可能多的帖子。很抱歉,如果我错过了回答我问题的人,但我只是找不到解决此问题的方法,将非常感谢您的帮助。

谢谢。

MainActivity.java

MainActivity.java

... @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private MainActivity activity; private boolean notificationsOn=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.activity = this; ... // HERE IS THE PROBLEM Switch notifSwitch = findViewById(R.id.notif_switch); // notifSwitch = null // Error on next line notifSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { notificationsOn = true; Toast.makeText(getApplicationContext(), "Notifications enabled", Toast.LENGTH_SHORT).show(); } else { notificationsOn = false; Toast.makeText(getApplicationContext(), "Notifications disabled", Toast.LENGTH_SHORT).show(); } } }); } ...

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:background="@color/colorPrimary" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" android:background="@color/colorPrimary"/> </android.support.v4.widget.DrawerLayout>

activity_main_drawer.xml

<?xml version="1.0" encoding="utf-8"?> <menu 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" tools:showIn="navigation_view" ...> ... <item android:id="@+id/nav_notifications" app:actionLayout="@layout/line_notif" android:enabled="true" tools:ignore="MenuTitle" /> ... </menu>

line_notif.xml

完整的错误:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/line_notif"
    android:background="@android:color/transparent">

    ...

    <Switch
        android:id="@+id/notif_switch"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="end"
        android:theme="@style/SwitchTheme"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:paddingTop="15dp"/>

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

  

我怀疑这与以下事实有关:ID为'notif_switch'的小部件(我尝试获取其值的Switch)不是(直接)在{{ 1}},这是我在activity_main.xml方法开始时传递给setContentView的布局

您是对的,这就是问题所在。建议您阅读this post,了解如何创建小部件。您将了解到小部件中允许的组件是有限的,因此您与它们的交互。