findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null [英] findFragmentByTag() returns null after perform a FragmentTransaction using replace() method

查看:21
本文介绍了findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 Android 应用包含三个片段:A、B 和 C.它们加载在 MainActivity 布局中定义的两个容器中.

My Android app consists three fragments: A, B and C. They're loaded in the two containers defined in the MainActivity layout.

当应用程序启动时,它会显示在left_container 中加载的fragmentA 和在right_container 中加载的fragmentC.

When the app is started, it shows the fragmentA loaded in the left_container and the fragmentC in the right_container.

如果您按下 fragmentA 中的按钮,FragmentTransaction 会将 FragmentC 更改为 FragmentB.

If you press the button in the fragmentA, a FragmentTransaction changes FragmentC by FragmentB.

目前一切正常.但是当我尝试使用 findFragmentByTag() 获取对加载的fragmentB 的引用时出现问题,因为它返回null.我在 FragmentTransaction 中使用了方法替换,我已经用 commit() 完成了它,但是没有办法调用 FragmentB 方法.我的代码:

At the moment everything OK. But the trouble appears when I try to get a reference to the loaded fragmentB using findFragmentByTag(), because it returns null. I've used the method replace in the FragmentTransaction and I've finished it with commit(), but there isn't way to call FragmentB method. My code:

MainActivity.java:

MainActivity.java:

 public class MainActivity extends Activity{
 static String fragmentTag = "FRAGMENTB_TAG";

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //Adds the left container's fragment
    getFragmentManager().beginTransaction().add(R.id.left_container, new FragmentA()).commit(); //Adds the fragment A to the left container

    //Adds the right container's fragment
    getFragmentManager().beginTransaction().add(R.id.right_container, new FragmentC()).commit(); //Adds the Fragment C to the right container
 }

 /**
 * Called when the button "Activate Fragment B" is pressed
 */
public void buttonListener(View v){

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.right_container, new FragmentB(),fragmentTag); //Replaces the Fragment C previously in the right_container with a new Fragment B
        ft.commit(); //Finishes the transaction


        //!!HERE THE APP CRASHES (java.lang.NullPointerException = findFragmentByTag returns null
        ((FragmentB) getFragmentManager().findFragmentByTag(fragmentTag)).testView();


    }
}

FragmentB.java:

FragmentB.java:

public class FragmentB extends Fragment {

public View onCreateView(LayoutInflater inflater,
        ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_b, container,false);

}


/**
 * Gets a reference to the text_fragment_b TextView and calls its method setText(), changing "It doesn't work" text by "It works!"
 */
public void testView(){
    TextView tv = (TextView)getView().findViewById(R.id.text_fragment_b);
    tv.setText("It works!");
}

}

activity_main.xml:

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="horizontal" >

<FrameLayout android:id="@+id/left_container" android:layout_width="0px" android:layout_weight="50" android:layout_height="match_parent"/>    
<FrameLayout android:id="@+id/right_container" android:layout_width="0px" android:layout_weight="50" android:layout_height="match_parent"/>

</LinearLayout>

fragment_b.xml:

fragment_b.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" 
android:layout_margin="5sp">

<TextView 
    android:id="@+id/text_fragment_b"
    android:text="It doesn't works!"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>

请帮帮我!我是Android开发的初学者!

Please help me! I'm a beginner in Android development!

推荐答案

我已经解决了!我在完成交易后调用了 getSupportFragmentManager().executePendingTransactions() 并且成功了!调用该方法后,我可以使用 findFragmentById()findFragmentByTag() 方法获取片段.

I've fixed it! I called getSupportFragmentManager().executePendingTransactions() after doing the transaction and it worked! After calling that method I can get the fragment using both findFragmentById() and findFragmentByTag() methods.

这篇关于findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆