Fragment ViewPager中的后退按钮实现

时间:2016-03-07 15:20:49

标签: java android android-fragments onbackpressed

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

}

1 个答案:

答案 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

希望它有所帮助!