gpt4 book ai didi

java - 在选项卡更改后(使用支持库),先前分离的 fragment 在当前 fragment 后面保持可见

转载 作者:行者123 更新时间:2023-11-30 03:21:52 26 4
gpt4 key购买 nike

这是我的 TabListener:

    public class TabListener<T extends Fragment> implements android.support.v7.app.ActionBar.TabListener {

private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;

public TabListener(Activity activity, String tag, Class<T> cl) {
mActivity = activity;
mTag = tag;
mClass = cl;
}

@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag); // add this

if (mFragment == null){
mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content,mFragment,mTag);
} else {
ft.attach(mFragment);
}
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag); // add this
if (mFragment != null) {
//Toast.makeText(mActivity, "detached", Toast.LENGTH_SHORT).show();
ft.detach(mFragment);
}
}

}

以及我的 Activity 的一部分:

public class RoadMapActivity extends ActionBarActivity {

ListView generalRoadmapList;
ListView mainRoadmapList;
android.support.v7.app.ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roadmap);

actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

Tab generalTab = actionBar.newTab()
.setText("General")
.setTabListener(new TabListener<GeneralListFragment>(this, "general", GeneralListFragment.class));
actionBar.addTab(generalTab);

Tab myTab = actionBar.newTab()
.setText("My")
.setTabListener(new TabListener<MyListFragment>(this, "my", MyListFragment.class));
actionBar.addTab(myTab);
}

我尝试将 viewGroup 从 android.R.id.content 更改为 Activity 布局中的自定义 View 组,接下来会发生:

我有两个选项卡,A 和 B。启动 Activity 后, Activity 选项卡为 A,内容为 fragment A。如果切换到 B,选项卡 B 会激活,但内容仍然是 fragment A。比回到选项卡 A,内容将是 fragment B。 切换到选项卡 B,内容是 fragment A... 没有显示后面的另一个 fragment ,但内容发生了变化。

我已经尝试了我在谷歌和这里找到的所有东西,但没有任何成功。有人有想法吗?

最佳答案

我基于 Chris 的回答的最终解决方案:

    public class TabListener<T extends Fragment> implements android.support.v7.app.ActionBar.TabListener {

private Fragment mFragment;
private String mTag;
private boolean added = false;

private TabListener(String tag, Fragment fragment) {
mTag = tag;
mFragment = fragment;
}

@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

if (!added){
ft.replace(R.id.list_container,mFragment,mTag);
added = true;
} else {
ft.attach(mFragment);
}
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.detach(mFragment);
}

}

fragment 的实例化(每个选项卡都有自己的监听器):

        Tab myTab = actionBar.newTab()
.setText("My")
.setTabListener(new TabListener<MyListFragment>("my", new MyListFragment()));
actionBar.addTab(myTab);

我已经完成了您的解决方案,因为这样 fragment 不会在每个选项卡更改时破坏和创建,如果您改回它们,您会发现它处于相同的状态。仅在 Activity 重新启动时销毁和重新创建(例如,方向更改后)。

非常感谢克里斯!

关于java - 在选项卡更改后(使用支持库),先前分离的 fragment 在当前 fragment 后面保持可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988622/

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