Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Android片段设置复选框时出现Null P异常 总结_Java_Android_Android Fragments_Android Studio_Checkbox - Fatal编程技术网

Java 使用Android片段设置复选框时出现Null P异常 总结

Java 使用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

我想我可以在片段中创建一个复选框,并在MainActivity中以编程方式控制它。检查下面的链接以获取教程

应该使用片段来“模块化”应用程序。我想我可以把所有的代码放在MainActivity中,并在片段中设置UI元素,因为我对Java/Android的经验非常有限

一般来说,碎片应该照顾好它自己拥有的一切。下面是我所做的:

MainActivity.java中,我删除了复选框视图和引用

然后我在片段内创建了一个复选框(FragmentTest.java),如下所示:

activity_main.xml中,我删除了片段。不需要它,因为在MainActivity.java
//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);
...