gpt4 book ai didi

java - Fragment ViewPager 中的后退按钮实现

转载 作者:行者123 更新时间:2023-12-01 10:16:49 25 4
gpt4 key购买 nike

我在 ViewPager 中有 3 个 Fragments。我有不同的后退按钮功能,我想为每个 Fragment 实现这些功能。目前,我已经在每个 fragment 中创建了与我希望后退按钮执行的操作相对应的方法。我使用以下方法在我的 Activity 中实现了一个接口(interface):

@Override
public void onCameraBack(int i) {
currFrag = i;
}

这里的想法是存在三个 fragment ,每个 fragment 在其 onStart() 方法中调用此方法。 fragment 0传递0, fragment 1传递1, fragment 2传递2。这样持有 Activity 就知道哪个 fragment 是可见的。现在我试图获取对该 fragment 的引用,以便能够调用我在其中实现的后退按钮方法。我尝试使用这个:

@Override
public void onBackPressed() {
if (currFrag == 0) {

}
else if (currFrag == 1) {
FragmentBTesting fragmentBTesting= new FragmentBTesting();
fragmentBTesting.FragmentBBack();
}
}`

但这不起作用。我无法使用 findFragmentbyId 方法,因为我的 fragment 在其 XML 中没有 fragment 标签,它们填充整个屏幕,并且它们的 View 是使用 linearLayouts 定义的。我的问题是如何获取 fragment 的实例,以便调用其 FragmentBack() 方法。

这是我的完整 Activity

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

}

最佳答案

与其告诉您的 Activity 您当前所在的 fragment ,为什么不告诉它按下后退时要执行什么?

在你的activity中,你可以有一个字段来保存回调字段(作为一个Runnable,我知道很多讨厌的东西。如果你愿意,你可以制作自己的界面),setter,然后onBackPressed 实现。这是我的代码中有效的 fragment 。我正在使用 Guava 的 Optional 类,但如果您喜欢那样的东西,您可以 null 它。

这是应该实现ActivityWithHomeButton的 Activity

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

这是我在 Activity 中实现的接口(interface)

public interface ActivityWithHomeButton {
void setBackButtonListener(Optional<? extends Runnable> runnable);
}

当然还有 fragment 的用法

parent.setBackButtonListener(Optional.of(new Runnable() {
@Override
public void run() {
// do back button stuff
}
}));

您可以将其放在 fragment 中的任何位置。当您不再需要后退按钮监听器时,您还需要清除它(onPause)。你可以这样做

parent.setBackButtonListener(Optional.<Runnable>absent());

可以使用此处详细介绍的标准 Activity fragment 通信模式来获取 parent ( http://developer.android.com/training/basics/fragments/communicating.html )。此代码放入您的 fragment 中

private ActivityWithHomeButton parent;

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
parent = (ActivityWithHomeButton) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ActivityWithHomeButton");
}
}

希望对你有帮助!

关于java - Fragment ViewPager 中的后退按钮实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com