【问题标题】:Android replace the current fragment with another fragmentAndroid用另一个片段替换当前片段
【发布时间】:2011-11-17 06:40:51
【问题描述】:

我刚开始为 HoneyComb 设计片段。我创建了两个片段。当我单击左侧片段中的按钮时,会在右侧创建一个新片段。同时,当我单击右侧片段中的按钮时(即,我下面代码中的 DetialsFragment 应该被另一个片段替换。 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" >
    <fragment class="com.fragment.example.Titles"
        android:id="@+id/titles" android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent" />
    <FrameLayout android:id="@+id/details" android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent" />

</LinearLayout>

FragmentExample.java

public class FragmentExample extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Titles.java

public class Titles extends Fragment {
    public FragmentTransaction ft;
    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main1, null);
        Button button1 = (Button)v.findViewById(R.id.button1);
        button1.setText("santhosh");
        button1.setOnClickListener(new OnClickListener() {



            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                 DetailsFragment details = (DetailsFragment)
                            getFragmentManager().findFragmentById(R.id.details);
                    if (details == null || details.getShownIndex() != 1) {
                        // Make new fragment to show this selection.
                        details = DetailsFragment.newInstance(1);

                        // Execute a transaction, replacing any existing
                        // fragment with this one inside the frame.
                        ft
                                = getFragmentManager().beginTransaction();
                        ft.add(R.id.details, details, "detail");
                        ft.setTransition(
                                FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                        ft.commit();
                    }
            }

        });
        return v;
    }
}

DetailsFragment.java

public class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    Titles title = new Titles();
    String[] titles = {"Title1", "Title2", "Title3", "Title4"};
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            // Currently in a layout without a container, so no
            // reason to create our view.
            return null;
        }
        Button button = new Button(getActivity());
        button.setText("Next");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            }
        });
        return button;
    }
}

【问题讨论】:

    标签: android android-3.0-honeycomb android-fragments


    【解决方案1】:

    然后,如果您的按钮正在显示并且点击事件被触发,您可以在您的点击事件中调用以下内容:

    final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
    ft.commit(); 
    

    如果您想在单击返回时返回 DetailsFragment,请确保将上述事务添加到后台堆栈,即

    ft.addToBackStack(null);
    

    或者我错过了什么?或者,有些人建议您的活动获取按钮的单击事件,并负责替换详细信息窗格中的片段。

    【讨论】:

    • 提供片段标签是可选的。你可以做ft.replace(R.id.details, new NewFragmentToReplace());
    • 也别忘了getFragmentManager().executePendingTransactions();
    • 按钮不会从前一个片段中消失。旧片段的按钮在新片段的顶部仍然可见。
    【解决方案2】:

    最新动态

    好的。所以这是一个非常古老的问题,从那时起就有很好的答案。但从那以后发生了很多变化。

    现在,在 2020 年,如果您正在使用 Kotlin 并想要更改片段,那么您可以执行以下操作。

    1. 将片段的 Kotlin 扩展添加到您的项目中。

    在您的应用级别build.gradle 文件中添加以下内容,

    dependencies {
        def fragment_version = "1.2.5"
    
        // Kotlin
        implementation "androidx.fragment:fragment-ktx:$fragment_version"
        // Testing Fragments in Isolation
        debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
    }
    
    1. 然后用简单的代码替换片段,

    在你的活动中

    supportFragmentManager.commit {
        replace(R.id.frame_layout, YourFragment.newInstance(), "Your_TAG")
        addToBackStack(null)
    }
    

    参考文献

    Check latest version of Fragment extension

    More on Fragments

    【讨论】:

    • 这适用于 Kotlin 从今天开始,只需从这里 https://developer.android.com/jetpack/androidx/releases/fragment 将版本替换为当前版本即可
    【解决方案3】:

    你可以试试下面的代码。从旧片段推送新片段是非常简单的方法。

    private int mContainerId;
    private FragmentTransaction fragmentTransaction;
    private FragmentManager fragmentManager;
    private final static String TAG = "DashBoardActivity";
    
    public void replaceFragment(Fragment fragment, String TAG) {
    
        try {
            fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(mContainerId, fragment, tag);
            fragmentTransaction.addToBackStack(tag);
            fragmentTransaction.commitAllowingStateLoss();
    
        } catch (Exception e) {
            // TODO: handle exception
        }
    
    }
    

    【讨论】:

    • 什么是 mcontainerid
    • @Ayoub 是你的视图 id.. java 中的示例 linearLayout.getId()
    【解决方案4】:

    在您的代码中使用 android.support.v4.app 来表示 FragmentManager 和 FragmentTransaction,它对我有用。

    DetailsFragment detailsFragment = new DetailsFragment();
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.details,detailsFragment);
    fragmentTransaction.commit();
    

    【讨论】:

      【解决方案5】:

      如果您有一个现有片段的句柄,您可以将其替换为片段的 ID。

      Kotlin 中的示例:

      fun aTestFuction() {
         val existingFragment = MyExistingFragment() //Get it from somewhere, this is a dirty example
         val newFragment = MyNewFragment()
         replaceFragment(existingFragment, newFragment, "myTag")
      }
      
      fun replaceFragment(existing: Fragment, new: Fragment, tag: String? = null) {
          supportFragmentManager.beginTransaction().replace(existing.id, new, tag).commit()
      }
      

      【讨论】:

      • val existingFragment = supportFragmentManager.fragments.first()
      【解决方案6】:

      更新的答案(同样适用于重叠问题)

      @aniket-thakur(https://stackoverflow.com/users/2396539/aniket-thakur) 给出了正确答案。谢谢你!

      但是,getFragmentManager() 已被弃用,所以下面的代码确实对我有用。

      final FragmentTransaction ft = getParentFragmentManager().beginTransaction();
                      ft.replace(R.id.nav_host_fragment, new GalleryFragment(), "NewFragmentTag");
                      ft.addToBackStack(null);
                      ft.commit();
      

      【讨论】:

        【解决方案7】:

        用 Fragment 替换很简单。

        DataFromDb changeActivity = new DataFromDb();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.changeFrg, changeActivity);
            transaction.commit();
        

        【讨论】:

          猜你喜欢
          • 2017-06-12
          • 1970-01-01
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-30
          相关资源
          最近更新 更多