Java 使用Android片段设置复选框时出现Null P异常 总结
我想我可以在片段中创建一个复选框,并在MainActivity中以编程方式控制它。检查下面的链接以获取教程 应该使用片段来“模块化”应用程序。我想我可以把所有的代码放在MainActivity中,并在片段中设置UI元素,因为我对Java/Android的经验非常有限 一般来说,碎片应该照顾好它自己拥有的一切。下面是我所做的: 在MainActivity.java中,我删除了复选框视图和引用 然后我在片段内创建了一个复选框(FragmentTest.java),如下所示: 在activity_main.xml中,我删除了片段。不需要它,因为在MainActivity.javaJava 使用Android片段设置复选框时出现Null P异常 总结,java,android,android-fragments,android-studio,checkbox,Java,Android,Android Fragments,Android Studio,Checkbox,我想我可以在片段中创建一个复选框,并在MainActivity中以编程方式控制它。检查下面的链接以获取教程 应该使用片段来“模块化”应用程序。我想我可以把所有的代码放在MainActivity中,并在片段中设置UI元素,因为我对Java/Android的经验非常有限 一般来说,碎片应该照顾好它自己拥有的一切。下面是我所做的: 在MainActivity.java中,我删除了复选框视图和引用 然后我在片段内创建了一个复选框(FragmentTest.java),如下所示: 在activity_ma
//setContentView(R.layout.activity\u main)中代码>被注释掉
如果您想了解更多关于片段的信息,请查看此视频。我帮助我理解了片段的概念以及如何正确使用它们
原始问题
今天我尝试在我的Android应用程序中实现片段。我遵循了各种教程,几乎所有的工作都正常,将我的片段设置为主布局,也按ID查找复选框,但尝试将我的复选框设置为false将返回空指针异常。我看了不同的问题,但找不出答案。所有代码如下。谢谢你抽出时间
请注意,当我删除这一行时,它会正常显示复选框。但是我不能在我的主活动文件中设置它
fragmentCheckbox.setChecked(false);
我得到的错误是:
Attempt to invoke virtual method 'void android.widget.CheckBox.setChecked(boolean)' on a null object reference
完整日志
FATAL EXCEPTION: main
Process: *...............*.androidfragments, PID: 18658
java.lang.RuntimeException: Unable to start activity ComponentInfo{*...............*.androidfragments/*...............*.androidfragments.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.CheckBox.setChecked(boolean)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.CheckBox.setChecked(boolean)' on a null object reference
at *...............*.androidfragments.MainActivity.onCreate(MainActivity.java:27)
at android.app.Activity.performCreate(Activity.java:5953)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
主要活动:
在这里,我只是将我的片段设置为我的主布局
public class MainActivity extends AppCompatActivity {
CheckBox fragmentCheckbox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentTest fragmentTest = new FragmentTest();
fragmentTransaction.replace(android.R.id.content, fragmentTest);
fragmentTransaction.commit();
fragmentCheckbox = (CheckBox) findViewById(R.id.checkBoxInFragment);
fragmentCheckbox.setChecked(false);
}
}
碎片测试:返回我的碎片
public class FragmentTest extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.test_fragment, container, false);
}
}
我的测试片段XML文件:基本上给我的复选框一个ID
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New CheckBox"
android:id="@+id/checkBoxInFragment"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
和我的主XML文件
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/test_fragment"/>
调用replace
时不会立即创建片段视图,因此您需要等到它实际创建后才能调用findViewById
您能将setChecked()
放入片段吗
public class FragmentTest extends Fragment{
CheckBox fragmentCheckbox;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test_fragment, container, false);
fragmentCheckbox = (CheckBox) view.findViewById(R.id.checkBoxInFragment);
fragmentCheckbox.setChecked(false);
return view;
}
}
编辑
请尝试UI线程post,以便在活动中等待碎片事务
new Handler().post(new Runnable () {
public void run () {
fragmentCheckbox = (CheckBox) findViewById(R.id.checkBoxInFragment);
fragmentCheckbox.setChecked(false);
}
}
如果你不能。
试试这个
....
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
fragmentCheckbox = (CheckBox) findViewById(R.id.checkBoxInFragment);
fragmentCheckbox.setChecked(false);
...
您试图在活动内设置复选框,但复选框位于片段xml内。因此,如果要设置复选框,请选中复选框。在片段的activitycreated方法中这样做。
并在onCreateView方法内创建复选框的对象(如果是片段)。由于复选框对活动不直接可用,所以它引发空指针异常。希望有帮助。如果视图位于片段中,通常希望片段控制该视图,而不是活动。是的,这是可行的,但是我有一段更大的代码,我想用片段分割。例如:我连接到一个服务器,一旦连接断开,我希望显示一个片段,在那里我可以再次连接到服务器。代码是否可能不在片段中,而是在主活动中?嘿,设置复选框与处理程序方法一起工作。非常感谢。但我是否必须在fragmentTransaction.commit()之后将onCreate方法中的每一段代码都放入这个处理程序?处理程序post只需要在fragmentTransaction.commit()之后立即进行。或者,您可以尝试第三种executePendingTransactions()
?否,.executePendingTransactions();不适合我。只有处理程序的方式有效。但是当我有一个onClick监听器时,它在处理程序内外都不起作用。是否有一种方法可以等待片段初始化其布局中的所有视图。所以它不会返回空指针异常?嗯。。。请使用。并创建setChecked()
方法来测试片段。setChecked()
包含处理程序的post-setChecked。对于checkBox.setChecked()
,您必须实现processMessage()
。
....
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
fragmentCheckbox = (CheckBox) findViewById(R.id.checkBoxInFragment);
fragmentCheckbox.setChecked(false);
...