Android用另一个片段替换当前片段

San*_*man 48 android android-fragments android-3.0-honeycomb

我刚开始使用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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

PJL*_*PJL 94

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

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

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

ft.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)

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

  • 按钮不会消除之前的片段.旧片段的按钮仍然可以在新片段的顶部看到. (4认同)
  • 提供片段标签是可选的.你可以做`ft.replace(R.id.details,new NewFragmentToReplace());` (3认同)

gpr*_*our 6

最新动态

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

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

  1. 将 Fragments 的 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"
}
Run Code Online (Sandbox Code Playgroud)
  1. 然后简单的代码来替换片段,

在你的活动中

supportFragmentManager.commit {
    replace(R.id.frame_layout, YourFragment.newInstance(), "Your_TAG")
    addToBackStack(null)
}
Run Code Online (Sandbox Code Playgroud)

参考

检查 Fragment 扩展的最新版本

有关片段的更多信息