我做了很多程序,我在单个活动中实现了多个碎片,但是当使用单个活动将多个碎片作为选项卡托管然后在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();
}
答案 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");
如果您遇到任何困难,可以提出问题。