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


77

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

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

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

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

    }
});

仅供参考:这是从一个片段内部(我不知道这是否重要)。


重要说明:使用片段时,导航与主机活动密切相关,因此,如果不在主机Activity中实现该片段类,就无法从一个片段跳转到另一个片段。示例: public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener { 另外,检查您的主机活动是否具有下一个覆盖功能:`@Override public void onFragmentInteraction(Uri uri){}`希望这有帮助...
Gerry R

Answers:


144

在您的点击监听器函数中添加以下代码,

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

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


13
会是Layout_container什么?
Shailendra Madda'3

5
谁能澄清Layout_container应该是什么?
Huw Davies

8
Layout_container是当前片段的ID。我建议使用((ViewGroup).getView()。getParent())。getId()而不是R.id.Layout_container。
BTR Naidu

layout_container是您要替换片段的活动布局中存在的视图ID
Asad Ali,

8
@BTRNaidu应该是:((ViewGroup)getView()。getParent())。getId();
KvnH

9

这是@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();

希望这会起作用。如果使用android x,则需要getSupportFragmentManager()而不是getFragmentManager()。


那会content_main是什么?
Huw Davies

1
@HuwDavies主机活动布局文件中ID父级View的值。示例:<FrameLayout android:id =“ @ + id / fragment_container” android:layout_width =“ match_parent” android:layout_height =“ match_parent” />
Eaweb

4

您应该在活动内部创建一个函数以打开新的片段,并将活动引用传递给该片段,然后在片段内部的某个事件上调用此函数。


2
在片段内部,您已经自动有了对父活动的引用。使用getActivity()或如果使用onAttach,则活动位于参数中。
miva2 2015年

3

用这个,

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

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

content_frame在哪里?是框架布局吗?
路加福音

2

使用科特林更换Fragment另一个的container,你可以做

button.setOnClickListener {
    activity!!
        .supportFragmentManager
        .beginTransaction()
        .replace(R.id.container, NewFragment.newInstance())
        .commitNow()
}

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

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


0

首先,为您的Fragment布局设置一个ID,例如:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
**android:id="@+id/cameraFragment"**
tools:context=".CameraFragment">

并使用该ID将视图替换为另一个fragment.java文件。例如

 ivGallary.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          UploadDoc uploadDoc= new UploadDoc();
          (getActivity()).getSupportFragmentManager().beginTransaction()
                  .replace(**R.id.cameraFragment**, uploadDoc, "findThisFragment")
                  .addToBackStack(null)
                  .commit();
      }
  });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.