fragment使用replace切换到其他fragment中获取findFragmentById为null

findFragmentById这个方法功能很强大可以获取到指定fragment的实例并对其进行操作,但是今天碰到一个问题写了三个button切换并设置了一个静态的fragment,刚进去看到的是默认的fragment按下了其他button切换过去在切换回来使用findFragmentById就会出现null的问题,先贴代码

package com.example.my_qqfragment_demo;

import android.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    Button bt1 = null;
    Button bt2 = null;
    Button bt3 = null;
    Button one_bt1 = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化所有控件
        init();
    }

    private void init() {
        bt1 = (Button) findViewById(R.id.item_bt_1);
        bt2 = (Button) findViewById(R.id.item_bt_2);
        bt3 = (Button) findViewById(R.id.item_bt_3);
        one_bt1 = (Button) findViewById(R.id.item_one_bt1);
    }

    public void onClick(View v) {

        //Fragment管理器
        FragmentManager fm = null;

        //Fragment事务
        android.app.FragmentTransaction fta = null;

        switch (v.getId()) {
            case R.id.item_bt_1:

                //获取A实例
                item_one_Activity ioa = new item_one_Activity();

                //获取Fragment管理器
                fm = getFragmentManager();

                //开启事务
                fta = fm.beginTransaction();

                //事务操作,清除布局内容全部Fragment,并添加新的Fragment内容
                fta.replace(R.id.item_content,ioa);

                //提交事务
                fta.commit();

                break;
            case R.id.item_bt_2:

                //获取到B实例
                item_two_Activity iob = new item_two_Activity();

                //获取到Fragment管理器
                fm = getFragmentManager();

                //开启事务
                fta = fm.beginTransaction();

                //事务操作,清除布局内容全部Fragment,并添加新的Fragment内容
                fta.replace(R.id.item_content,iob);

                //提交事务
                fta.commit();

                break;
            case R.id.item_bt_3:

                //获取到C实例
                item_three_Activity ioc = new item_three_Activity();

                //获取到Fragment管理器
                fm = getFragmentManager();

                //开启事务
                fta = fm.beginTransaction();

                //事务操作,清除布局内容全部Fragment,并添加新的Fragment内容
                fta.replace(R.id.item_content,ioc);

                //提交事务
                fta.commit();
                break;
            case R.id.item_one_bt1 :

                //尝试获取到静态的Fragment
                item_one_Activity item_bt = (item_one_Activity) getFragmentManager()
                        .findFragmentById(R.id.content_fragment);

                if (item_bt != null) {
                    item_bt.fragmentont();
                }

                break;
            default:
                break;
        }
    }
}

重要的是下面这几个

                //尝试获取到静态的Fragment
                item_one_Activity item_bt = (item_one_Activity) getFragmentManager()
                        .findFragmentById(R.id.content_fragment);

                if (item_bt != null) {
                    item_bt.fragmentont();
                }

下面是xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.my_qqfragment_demo.MainActivity">

    <FrameLayout
        android:id="@+id/item_content"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"
        android:layout_gravity="center"
        android:layout_weight="10">

        <fragment
            android:name="com.example.my_qqfragment_demo.item_one_Activity"
            android:id="@+id/content_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </FrameLayout>

    <fragment
        android:name="com.example.my_qqfragment_demo.button_activity"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        tools:layout="@layout/layout_button"
        android:layout_weight="1"
        />


</LinearLayout>

我在这里定义了一个静态的fragment设定id是fragment然后在类里面尝试获取到这个实例

        <fragment
            android:name="com.example.my_qqfragment_demo.item_one_Activity"
            android:id="@+id/content_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

刚进去点击按钮获取到了实例,但是我点击了button2切换到其他的fragment,返回的时候提示null,请注意下一行,这行的意思是清空布局下所有fragment并插入新的fragment

切换,我把静态的fragment给清掉了,再回来有可能还有数据吗?

                //事务操作,清除布局内容全部Fragment,并添加新的Fragment内容
                fta.replace(R.id.item_content,ioc);

解决方案

//尝试获取到静态的Fragment,如果静态的Fragment被销毁那么动态获取
item_one_Activity item_bt = (item_one_Activity) getFragmentManager()
        .findFragmentById(R.id.content_fragment);

//如果item_bt等于null那么说明之前已经把静态的数据全部清空了,现在的是动态的,那么我就获取布局下
//的动态fragment
if (item_bt == null) {
    item_bt = (item_one_Activity) getFragmentManager()
            .findFragmentById(R.id.item_content);
}
if (item_bt != null) {
    item_bt.fragmentont();
} else {
    Toast.makeText(this, "item_btnull", Toast.LENGTH_SHORT).show();
}
xml中

<FrameLayout
    android:id="@+id/item_content"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:gravity="center"
    android:layout_gravity="center"
    android:layout_weight="10">

    <fragment
        android:name="com.example.my_qqfragment_demo.item_one_Activity"
        android:id="@+id/content_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

因为我刚开始获取实例获取到的是静态的实例所以是有的但是在进行事务操作的时候已经把静态的fragment干掉了,我们再获取已经获取不到了,只能获取到整个布局下的fragment,然后我获取到了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 在 Fragment 可以通过 getActivity().getSupportFragmentManager() 方法获取 Activity FragmentManager。获取FragmentManager 后,就可以使用其提供的方法来管理其他 Fragment 实例。 例如,可以通过 FragmentManager 的beginTransaction()方法启动一个 Fragment 事务,在事务可以添加、删除或者替换 Fragment。示例代码如下: ``` //获取 Activity FragmentManager FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); //启动一个 Fragment 事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); //添加一个 Fragment MyFragment fragment = new MyFragment(); transaction.add(R.id.container, fragment); //提交事务 transaction.commit(); ``` 在上面的示例代码,我们获取了 Activity FragmentManager,并启动了一个 Fragment 事务。然后通过 add() 方法向容器添加了一个新的 Fragment 实例。最后调用 commit() 方法提交事务即可完成 Fragment 的管理。 除了添加 Fragment,也可以使用 remove() 方法来删除 Fragment使用 replace() 方法来替换 Fragment 等等。不同的操作需要使用不同的方法来实现,具体可以参考 FragmentManager 的相关文档。 ### 回答2: 在 Fragment 通过 getActivity().getFragmentManager() 方法来获取 Activity FragmentManager 实例。通过这个 FragmentManager 实例,我们可以对其他 Fragment 进行管理。 要管理其他 Fragment 实例,我们可以使用 FragmentTransaction 类来进行操作。通过 FragmentTransaction 类的实例,我们可以进行一系列的操作,包括添加、替换、移除和隐藏等。 要添加一个 Fragment 实例,我们可以使用 FragmentTransaction 的 add() 方法,并指定容器的 ID 和要添加的 Fragment 实例。例如: FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction(); MyFragment fragment = new MyFragment(); transaction.add(R.id.container, fragment); transaction.commit(); 要替换一个 Fragment 实例,我们可以使用 FragmentTransaction 的 replace() 方法,并指定容器的 ID 和要替换的 Fragment 实例。例如: FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction(); MyFragment fragment = new MyFragment(); transaction.replace(R.id.container, fragment); transaction.commit(); 要移除一个 Fragment 实例,我们可以使用 FragmentTransaction 的 remove() 方法,并指定要移除的 Fragment 实例。例如: Fragment fragment = getActivity().getFragmentManager().findFragmentById(R.id.container); if (fragment != null) { FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction(); transaction.remove(fragment); transaction.commit(); } 要隐藏一个 Fragment 实例,我们可以使用 FragmentTransaction 的 hide() 方法,并指定要隐藏的 Fragment 实例。例如: Fragment fragment = getActivity().getFragmentManager().findFragmentById(R.id.container); if (fragment != null) { FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction(); transaction.hide(fragment); transaction.commit(); } 以上就是在 Fragment 获取 Activity 的 FragmentManager 并管理其他 Fragment 实例的方法。 ### 回答3: 在 Fragment 获取 Activity FragmentManager 可以通过调用 getActivity() 方法来实现,然后使用 getSupportFragmentManager() 方法来获取 FragmentManager 的实例。具体代码如下: FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 获取FragmentManager 后,可以通过调用一系列的方法来管理其他 Fragment 实例,例如添加 Fragment、替换 Fragment、移除 Fragment 等。下面是几个常用的方法: 1. 添加 Fragment:可以使用 fragmentManager 的 beginTransaction() 方法开启一个事务,然后通过 add() 方法将要添加的 Fragment 添加到容器,最后调用 commit() 方法提交事务。示例代码如下: MyFragment myFragment = new MyFragment(); fragmentManager.beginTransaction().add(R.id.container, myFragment).commit(); 2. 替换 Fragment:可以使用 replace() 方法将容器Fragment 替换为新的 Fragment。示例代码如下: MyFragment myFragment = new MyFragment(); fragmentManager.beginTransaction().replace(R.id.container, myFragment).commit(); 3. 移除 Fragment:可以使用 remove() 方法将指定的 Fragment 从容器移除。示例代码如下: MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment); fragmentManager.beginTransaction().remove(myFragment).commit(); 以上是在 Fragment 获取 Activity FragmentManager 和管理其他 Fragment 实例的基本方法,可以根据具体需求进行调用和使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎纠板栗咖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值