我做过很多程序,其中我在单个活动中实现了多个片段,但是当使用单个活动将多个片段托管为选项卡然后在点击上显示另一个片段时,并非如此......
使用MaterialViewPager库,其中我调用不同的片段以在各自的选项卡中显示视图。
就像第一个选项卡一样,我使用了两个片段,其中
在第一个片段中,我正在使用RecyclerView...以显示菜单列表。
在第二个片段中,我正在使用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);
}
方法替换片段
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();
}
你可以有一个由承载这两个片段的活动实现的回调接口。片段 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...);
以替换片段。可以利用此回调接口与父活动以及该活动中托管的其他片段进行其他通信。
要替换片段,
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, someFragment).addToBackStack("null").commit();
你可以试试这个:
YourFragment fragment = new YourFragment();
FragmentTransaction transaction = ((AppCompatActivity) mContext).getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
有一个选项我以前一直在使用。我将添加带有清晰示例的解决方案。
所以你想把值从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 步:然后在活动中创建如下所示的实例。 其中在寻呼机适配器中创建片段
((FragmentA) fragment).setOnHomeButtonClicked(new FragmentA.HomePage() {
@Override
public void onHomeButtonsClicked(String buttonClicked) {
pageSelected.onHomeButtonsClicked(selectedPage);
}
}
});
步骤3:然后在活动中创建界面,如下所示。
public interface PageSelected {
void onHomeButtonsClicked(String clickedButton);
}
public void setOnHomeButtonClicked(PageSelected pageSelected) {
this.pageSelected = pageSelected;
}
步骤3:然后在onCreateView或onResume((的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");
如果你遇到任何困难,你可以提出你的问题。