Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将当前片段替换为另一个片段_Android_Android 3.0 Honeycomb_Android Fragments - Fatal编程技术网

Android将当前片段替换为另一个片段

Android将当前片段替换为另一个片段,android,android-3.0-honeycomb,android-fragments,Android,Android 3.0 Honeycomb,Android Fragments,我刚开始为蜂巢设计碎片。我创建了两个片段。当我单击左侧片段中的一个按钮时,右侧将创建一个新片段。同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该被另一个片段替换)。 main.xml Titles.java public class Titles extends Fragment { public FragmentTransaction ft; @Override public View onCreateView(LayoutInfla

我刚开始为蜂巢设计碎片。我创建了两个片段。当我单击左侧片段中的一个按钮时,右侧将创建一个新片段。同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该被另一个片段替换)。 main.xml

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;
    }
}

然后,如果显示了按钮并且触发了click事件,则可以在click事件中调用以下命令:

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
ft.commit(); 
如果要在单击“上一步”时返回DetailsFragment,请确保将上述事务添加到后堆栈中,即

ft.addToBackStack(null);

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

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

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
    }

}

使用
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();

如何替换为片段非常简单

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

如果你有一个现有片段的句柄,你可以用片段的ID替换它

科特林的例子:

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()
}
最新资料 好的。这是一个非常古老的问题,从那时起有很好的答案。但从那时起,很多事情都发生了变化

现在,在2020年,如果您正在与Kotlin合作,并且希望更改片段,那么您可以执行以下操作

  • 将片段的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"
    }
    
  • 然后用简单的代码替换片段
  • 在你的活动中

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

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

    @aniket-thakur()给出了正确的答案。谢谢

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

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

    提供片段标记是可选的。您可以执行
    ft.replace(R.id.details,new newfragmentoreplace());
    也不要忘记
    getFragmentManager().executePendingTransactions())
    按钮不会离开上一个片段。旧片段的按钮仍然可以在新片段的顶部看到。是什么mcontainerid@Ayoub是u视图id..example linearLayout.getId()在Java中,从今天起,这适用于Kotlin,只需在此处将该版本替换为当前版本
    https://developer.android.com/jetpack/androidx/releases/fragment
    supportFragmentManager.commit {
        replace(R.id.frame_layout, YourFragment.newInstance(), "Your_TAG")
        addToBackStack(null)
    }
    
    final FragmentTransaction ft = getParentFragmentManager().beginTransaction();
                    ft.replace(R.id.nav_host_fragment, new GalleryFragment(), "NewFragmentTag");
                    ft.addToBackStack(null);
                    ft.commit();