使用ViewPager选项卡从片段A调用片段B.

时间:2017-04-07 12:02:04

标签: android android-fragments

我做了很多程序,我在单个活动中实现了多个碎片,但是当使用单个活动将多个碎片作为选项卡托管然后在Tap上显示另一个碎片时... ...

使用MaterialViewPager library,我在其中调用不同的不同片段以在各自的标签中显示视图。

与第一个标签一样,我使用两个片段,其中

在First Fragment中,我使用RecyclerView ...来显示菜单列表。

在Second Fragment中,我使用RecyclerView ...来显示特定菜单下的项目列表。

所以我的问题是如何从片段中调用片段。

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), mRecyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {

                Value value = valueList.get(position);
                List<Learning> learning = value.getLearning();

                // using when putting "item" data into same recyclerview
                // but on back press just exiting, not showing list of Menus again
                /**
                learningAdapter = new LearningAdapter(learning, R.layout.card_learning, getActivity());
                mRecyclerView.setAdapter(learningAdapter);
                **/

                ItemFragment fragment = new ItemFragment();
                replaceFragment(fragment);

            }

方法replaceFragment

public void replaceFragment(Fragment someFragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    // using Fragment not Activity, so where can I use frame_container in xml
    transaction.replace(R.id.frame_container, someFragment); 
    transaction.addToBackStack(null);
    transaction.commit();
}

4 个答案:

答案 0 :(得分:1)

您可以拥有一个回调接口,该接口由托管这两个片段的活动实现。片段A将使用回调通知活动将A替换为片段B.根据您的需要,您可以通过回调方法本身传递参数。

您的回调界面:

public interface YourCallback {
    public void methodWhichReplacesFragmentAwithB(params...);
}

您的活动托管片段:

public class YourActivity extends ... implements YourCallback {
  ..
  ..
  @Override
  public void methodWhichReplacesFragmentAwithB(params...) {
    //insert replace fragment code here
  }
}  

您的片段将有一个回调对象YourCallback callbackObj;。可以使用活动(从活动传递为this 本身来初始化此回调对象,因为活动具有接口的实现。现在,您可以使用

callbackObj.methodWhichReplacesFragmentAwithB(actual_params...);

替换片段。此回调接口可用于与父Activity以及该活动中托管的其他片段的其他通信。

答案 1 :(得分:0)

替换片段,

FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, someFragment).addToBackStack("null").commit();

答案 2 :(得分:0)

你可以试试这个:

YourFragment fragment = new YourFragment();
FragmentTransaction transaction = ((AppCompatActivity) mContext).getSupportFragmentManager()
                            .beginTransaction();
transaction.replace(R.id.frame, fragment);
transaction.addToBackStack(null);
transaction.commit();

答案 3 :(得分:0)

我从很久以前就开始使用一种选择。我将用清晰的例子添加解决方案。

因此,您希望将值从fragment A传递到fragment B

所以,在这里你要做的是,你已经通过活动传递了价值。

1)您将值从fragment A传递给activity

2)然后activity改为fragment B

第1步:首先在fragment A

中创建一个类似于下面的界面
   public interface HomePage {
      void onHomeButtonsClicked(String clickedButton);
   }

   public void setOnHomeButtonClicked(HomePage homePage) {
     this.homePage = homePage;
   }

第2步:然后在Activity中创建如下所示的实例。在PagerAdapter

中创建片段的位置
 ((FragmentA) fragment).setOnHomeButtonClicked(new FragmentA.HomePage() {
                    @Override
                    public void onHomeButtonsClicked(String buttonClicked) {                         
                            pageSelected.onHomeButtonsClicked(selectedPage);                          
                        }
                    }
                });

第3步:然后在Activity中创建界面,如下所示。

public interface PageSelected {
    void onHomeButtonsClicked(String clickedButton);
}

public void setOnHomeButtonClicked(PageSelected pageSelected) {
    this.pageSelected = pageSelected;
}

第3步:然后在onCreateView或onRreume()

中的fragment B中添加以下方法
  ((MainActivity) getActivity()).setOnHomeButtonClicked(new MainActivity.PageSelected() {
        @Override
        public void onHomeButtonsClicked(String clickedButton) {
            //fragment B received the value here 
        }
    });

步骤5:最后在按钮点击中添加fragment A中的行或您要传递值的位置。

 homePage.onHomeButtonsClicked("Some String , by this code it is in String. you can change in your own data type");

如果您遇到任何困难,可以提出问题。