我如何从另一个片段中打开一个新片段?

问题描述 投票:63回答:8

我尝试在片段之间进行导航。我已经使NewFragment.java的新片段正常工作了。我的问题是:

如何使此onClickListener正确运行NewFragment.java

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent i = new Intent(getActivity(), NewFragment.class);
        startActivity(i);

    }
});

FYI:这是从片段内部(我不知道这是否重要)。

android android-fragments onclicklistener android-button
8个回答
120
投票

在点击侦听器功能中添加以下代码,

NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
             .replace(R.id.Layout_container, nextFrag, "findThisFragment")
             .addToBackStack(null)
             .commit();

如果需要,可以使用字符串"findThisFragment"在以后查找片段。


8
投票

这是@Narendra代码的更多描述代码,

首先,您需要第二个片段的实例。然后,您应该具有FragmentManager和FragmentTransaction的对象。完整的代码如下,

Fragment2 fragment2=new Fragment2();
FragmentManager fragmentManager=getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_main,fragment2,"tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

希望这会起作用。有时您可能会得到getSupportFragmentManager()而不是getFragmentManager()。


3
投票

您应该在活动内部创建一个函数以打开新片段,并将活动引用传递给该片段,并且在片段内部发生某个事件时,请调用此函数。


2
投票
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
    super.onListItemClick(l, v, pos, id);
    UserResult nextFrag= new UserResult();
    this.getFragmentManager().beginTransaction()
    .replace(R.id.content_frame, nextFrag, null)
    .addToBackStack(null)
    .commit();  
}

1
投票

[使用此,

AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();

0
投票
 Fragment fr = new Fragment_class();
             FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.viewpagerId, fr);
            fragmentTransaction.commit();

准确地说,R.id.viewpagerId是在当前类布局中创建的,在调用时,新的片段会自动渗透。


0
投票

添加到@Narendra解决方案...

[重要提示:在处理片段时,导航与主机活动密切相关,因此,如果不在主机Activity中实现该片段类,就无法从一个片段跳转到另一个片段。

示例:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

还请检查您的主机活动是否具有下一个覆盖功能:

@Override public void onFragmentInteraction(Uri uri) {} 希望这会有所帮助...


0
投票

我的问题是我使用了答案中的代码,此处将其作为解决方案进行检查,但是执行替换后,第一层仍然可见,并且仅在打开的片段下起作用。我的解决方案很简单,我添加了

.remove(CourseListFragment.this)

CourseListFragment是我尝试关闭的片段的类文件。(MainActivity.java,但对于特定部分(导航抽屉片段),如果它对您更有意义)所以我的代码现在看起来像这样:

LecturesFragment nextFrag= new LecturesFragment();

                    getActivity().getSupportFragmentManager().beginTransaction()
                            .remove(CourseListFragment.this)
                            .replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
                            .addToBackStack(null)
                            .commit();

它对我来说就像一种魅力。

© www.soinside.com 2019 - 2024. All rights reserved.