替换一个Fragment:之前的视图在后台仍然保持活动状态?

3

我正在开发一个应用程序,需要在选项卡切换时更改一个选项卡的视图。我使用 OnTabChangedListener 来实现它。我已经成功替换了视图。但是当我切换到其他选项卡时,先前的视图仍然可以在后台响应点击事件。为什么会这样呢?新的视图显示在前方,但是如果我点击上一个视图控件所在的任何地方,还是会执行相关功能。我不知道问题出在哪里,请帮助我解决。谢谢!

public class FragmentTabs extends FragmentActivity implements OnTabChangeListener {

private FragmentTabHost mTabHost;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.fragment_tabs);

    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);

    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.setOnTabChangedListener(this);

    if (Database.getSharedObject(getApplicationContext()).getAppSettings().getListView() == 1) {
        mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator("", getResources().getDrawable(R.drawable.home_tab)), HomeFragment.class, null);

    } else {
        mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator("", getResources().getDrawable(R.drawable.home_tab)), CalendarViewFragment.class, null);
    }
    mTabHost.addTab(mTabHost.newTabSpec("groups").setIndicator("", getResources().getDrawable(R.drawable.groups_tab)), GroupFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("templates").setIndicator("", getResources().getDrawable(R.drawable.templates_tab)), TemplateFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("settings").setIndicator("", getResource
    mTabHost.getTabWidget().getChildAt(0).getLayoutParams().height = height;
    mTabHost.getTabWidget().getChildAt(1).getLayoutParams().height = height;
    mTabHost.getTabWidget().getChildAt(2).getLayoutParams().height = height;
    mTabHost.getTabWidget().getChildAt(3).getLayoutParams().height = height;
    // Database.getSharedObject(getApplicationContext());

    mTabHost.setCurrentTab(0);
}

@Override
protected void onResume() {
    super.onResume();

}

@Override
public void onTabChanged(String arg0) {

    mTabHost.getCurrentTabView().invalidate();

    if (mTabHost.getCurrentTab() == 0) {
        if (Database.getSharedObject(getApplicationContext()).getAppSettings().getListView() == 1) {

            HomeFragment homeFragment = new HomeFragment();
            mTabHost.getCurrentTabView().invalidate();
            getSupportFragmentManager().beginTransaction().replace(R.id.realtabcontent, homeFragment).addToBackStack(null).commit();
        } else {

            CalendarViewFragment calendarViewFragment = new CalendarViewFragment();
            mTabHost.getCurrentTabView().invalidate();
            getSupportFragmentManager().beginTransaction().replace(R.id.realtabcontent, calendarViewFragment).addToBackStack(null).commit();

        }

    }

}

}


我也遇到了这个问题。如果我解决了,我会回答你的,但我知道你遇到的具体问题。我认为这可能与我们在选项卡中没有使用 android.R.id.content 有关,但我还没有测试过,所以可能根本不是问题。你在过去的三个星期中有任何进展吗? - dcow
这也可能与我们调用setContentView有关,而在开发者文档中它们没有这样做(无论如何,都要使用ActionBar的OnTabChangedListener)。我认为使用TabHost和我使用ActionBar不应该有任何影响(我打赌ActionBar只是使用一个TabHost)。也许问题在于FragmentManager。 - dcow
1个回答

0
在你的新选项卡的根布局中添加android:clickable="true"。这将防止点击事件传递到后面的布局。

但为什么旧片段还在那里? 代码片段中说他们正在调用 replace 而不是 add,这应该首先导致现有的片段被删除。 - Martin
是的,它不应该在那里。但我不知道为什么它仍然接收到点击事件。 - Usama Sarwar
@minipf 它会阻止在选项卡小部件上的任何类型的点击。 - Usama Sarwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接