我正在尝试获取Switch
小部件的状态。为此,我创建了一个新变量,如下所示:
Switch notifSwitch = findViewById(R.id.notif_switch)
。
但是这不起作用,因为现在notifSwitch
是null
,并且强制转换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.xml
和Switch
,但至少我没有任何错误,并且能够获取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>
答案 0 :(得分:0)
我怀疑这与以下事实有关:ID为'
notif_switch
'的小部件(我尝试获取其值的Switch
)不是(直接)在{{ 1}},这是我在activity_main.xml
方法开始时传递给setContentView
的布局
您是对的,这就是问题所在。建议您阅读this post,了解如何创建小部件。您将了解到小部件中允许的组件是有限的,因此您与它们的交互。