我在Fragments
内有3个ViewPager
。我有不同的后退按钮功能,我想为每个Fragment
实现。目前,我已经在每个片段中创建了与我想要后退按钮相对应的方法。我在我的活动中使用以下方法实现了一个接口:
@Override
public void onCameraBack(int i) {
currFrag = i;
}
这里的想法是有三个片段,每个片段在其onStart()
方法中调用此方法。片段0传递0,片段1传递1,片段2传递2.因此,保持活动知道哪个片段可见。现在我试图获得对该片段的引用,以便能够调用我在其中实现的后退按钮方法。我试过用这个:
@Override
public void onBackPressed() {
if (currFrag == 0) {
}
else if (currFrag == 1) {
FragmentBTesting fragmentBTesting= new FragmentBTesting();
fragmentBTesting.FragmentBBack();
}
}`
但这不起作用。我不能使用findFragmentbyId
方法,因为我的片段在其XML中没有片段标记,它们填满整个屏幕,并且使用linearLayouts
定义它们的视图。我的问题是如何获取片段的实例,以便我可以调用它的FragmentBack()
方法。
这是我的完整活动
public class FragmentActivityTesting extends FragmentActivity implements FragmentATesting.logoutListener,FragmentBTesting.onCameraBack {
ViewPager viewPager = null;
SessionManager session = new SessionManager(MyApp.getContext());
int currFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_activity_testing);
viewPager = (ViewPager) findViewById(R.id.pic_pager);
setStatusBarColor();
FragmentManager fragmentManager = getSupportFragmentManager();
viewPager.setAdapter(new MyAdapter(fragmentManager));
viewPager.setCurrentItem(1);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("CLOSE_ALL");
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
registerReceiver(broadcastReceiver, intentFilter);
}
@TargetApi(21)
public void setStatusBarColor() {
Window window = this.getWindow();
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
if (Integer.valueOf(android.os.Build.VERSION.SDK) >= 21) {
window.setStatusBarColor(this.getResources().getColor(R.color.green));
}
}
@Override
public void logout() {
session.logOut();
Intent a = new Intent(this,MainActivity.class);
startActivity(a);
Intent intent = new Intent("CLOSE_ALL");
this.sendBroadcast(intent);
finish();
}
@Override
public void onBackPressed() {
if (currFrag == 0) {
}
else if (currFrag == 1) {
FragmentBTesting fragmentBTesting= new FragmentBTesting();
fragmentBTesting.FragmentBBack();
}
}
@Override
public void onCameraBack(int i) {
currFrag = i;
}
}
class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position ==0) {
fragment = new FragmentATesting();
}
else if (position == 1) {
fragment = new FragmentBTesting();
}
else if (position == 2) {
fragment = new FragmentCTesting();
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
}
答案 0 :(得分:1)
为什么不告诉它在按下后面时要执行什么片段,而不是告诉你的活动你的活动是什么?
在你的活动中你可以有一个字段来保存回调字段(作为Runnable
,我非常讨厌。如果你愿意,可以创建自己的界面),setter,然后是{{ 1}}实施。这是我的代码中的代码片段。我正在使用Guava的onBackPressed
课程,但是如果你进入那种类型的话,你可以Optional
代替它。
这是应该实施null
ActivityWithHomeButton
这是我在活动中实现的界面
private Optional<? extends Runnable> backButtonListener = Optional.absent();
@Override
public void onBackPressed() {
// Check if there is a custom back button
if (backButtonListener.isPresent()) {
backButtonListener.get().run();
backButtonListener = Optional.absent();
} else {
super.onBackPressed();
}
}
@Override
public void setBackButtonListener(Optional<? extends Runnable> backButtonListener) {
this.backButtonListener = backButtonListener;
}
当然还有片段中的用法
public interface ActivityWithHomeButton {
void setBackButtonListener(Optional<? extends Runnable> runnable);
}
您可以将它放在片段中的任何位置。您还需要在不再需要时清除后退按钮侦听器(parent.setBackButtonListener(Optional.of(new Runnable() {
@Override
public void run() {
// do back button stuff
}
}));
)。你可以这样做
onPause
使用此处详述的标准活动片段通信模式(http://developer.android.com/training/basics/fragments/communicating.html)可以获得parent.setBackButtonListener(Optional.<Runnable>absent());
。这段代码放在你的片段中
parent
希望它有所帮助!