【问题标题】:FragmentView gives null on accessing childs in main activity AndroidFragmentView 在访问主要活动 Android 中的子项时为 null
【发布时间】:2015-07-07 09:43:51
【问题描述】:

我在我的主要活动中使用多个片段现在我尝试访问每个片段的子片段,但是当它的子片段被访问时它给了我空异常。

点击 button1 时未更改数据,点击 button2 时应用程序崩溃。 这是我的代码:

MainActivity

public class MainActivity extends Activity {


    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    Fragment fr;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
    }

    public void selectFrag(View view) {
        Fragment fr;

        if(view == findViewById(R.id.button1)) {
            //add a fragment 
            fr = new FragmentOne();
            TextView textView1 = (TextView) fr.getView().findViewById(R.id.textView1);
            textView1.setText("Fragment One");

        }else {
            //add a fragment 
            fr = new FragmentTwo();
            TextView textView2 = (TextView) fr.getView().findViewById(R.id.textView2);
            textView2.setText("Fragment Two");
        }
        fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_place, fr);
        fragmentTransaction.commit();


    }

}

FragmentOne

public class FragmentOne extends Fragment {
   @Override
   public View onCreateView(LayoutInflater inflater,
      ViewGroup container, Bundle savedInstanceState) {

       //Inflate the layout for this fragment

      return inflater.inflate(
              R.layout.fragment_one, container, false);
   }
}

片段二

public class FragmentTwo extends Fragment{
   @Override
   public View onCreateView(LayoutInflater inflater,
      ViewGroup container, Bundle savedInstanceState) {
      /**
       * Inflate the layout for this fragment
       */
      return inflater.inflate(
      R.layout.fragment_two, container, false);
   }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
  <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Fragment No.1"
        android:onClick="selectFrag" />

     <Button
         android:id="@+id/button2"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:onClick="selectFrag"
         android:text="Fragment No.2" /> 

   <fragment
        android:name="com.javacodegeeks.android.fragmentstest.FragmentOne"
        android:id="@+id/fragment_place"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

fragment_one.xml

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:orientation="vertical"
   android:background="#00ffff">

       <TextView
           android:id="@+id/textView1"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="This is fragment No.1"
           android:textStyle="bold" />

</LinearLayout>

fragment_two.xml

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:orientation="vertical"
   android:background="#ffff00">

       <TextView
           android:id="@+id/textView2"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:text="This is fragment No.2"
           android:textStyle="bold" />

</LinearLayout>

点击按钮 2 时的崩溃报告:

07-07 14:41:40.505: E/AndroidRuntime(15175): FATAL EXCEPTION: main
07-07 14:41:40.505: E/AndroidRuntime(15175): Process: com.javacodegeeks.android.fragmentstest, PID: 15175
07-07 14:41:40.505: E/AndroidRuntime(15175): java.lang.IllegalStateException: Could not execute method of the activity
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.view.View$1.onClick(View.java:3851)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.view.View.performClick(View.java:4466)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.view.View$PerformClick.run(View.java:18833)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.os.Handler.handleCallback(Handler.java:808)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.os.Handler.dispatchMessage(Handler.java:103)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.os.Looper.loop(Looper.java:193)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.app.ActivityThread.main(ActivityThread.java:5299)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at java.lang.reflect.Method.invokeNative(Native Method)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at java.lang.reflect.Method.invoke(Method.java:515)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at dalvik.system.NativeStart.main(Native Method)
07-07 14:41:40.505: E/AndroidRuntime(15175): Caused by: java.lang.reflect.InvocationTargetException
07-07 14:41:40.505: E/AndroidRuntime(15175):    at java.lang.reflect.Method.invokeNative(Native Method)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at java.lang.reflect.Method.invoke(Method.java:515)
07-07 14:41:40.505: E/AndroidRuntime(15175):    at android.view.View$1.onClick(View.java:3846)
07-07 14:41:40.505: E/AndroidRuntime(15175):    ... 11 more
07-07 14:41:40.505: E/AndroidRuntime(15175): Caused by: java.lang.NullPointerException
07-07 14:41:40.505: E/AndroidRuntime(15175):    at com.javacodegeeks.android.fragmentstest.MainActivity.selectFrag(MainActivity.java:37)
07-07 14:41:40.505: E/AndroidRuntime(15175):    ... 14 more

【问题讨论】:

    标签: android android-fragments android-fragmentactivity


    【解决方案1】:

    getView() 返回您在onCreateView 中扩展的视图。您可能知道onCreateViewFragment 生命周期的一部分,它在被调用时由系统决定,并且在您提交事务之后肯定会发生,并且之前不会发生。如果必须为片段提供值,可以使用 setArguments/getArguments 对。在实例化Fragment 时使用前者,而在onCreateView 中使用后者来检索信息并填充您的视图

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多