【问题标题】:Replacing a Fragment: Previous view remains Active in the background?替换片段:以前的视图在后台保持活动状态?
【发布时间】:2013-03-18 10:31:42
【问题描述】:

我正在研究一个应用程序,其中我必须在更改选项卡时更改一个选项卡的视图。我正在使用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 用于标签的事实有关,但我没有对其进行测试,所以它可能根本不是问题。您在过去三周内取得了任何进展吗?
  • 这也可能与我们调用 setContentView 的事实有关,他们在开发人员文档中没有这样做(无论如何将 OnTabChangedListener 与 ActionBar 一起使用)。我认为您使用 TabHost 而我使用 ActionBar 并不重要(我敢打赌 ActionBar 只是使用 TabHost。也许问题在于 FragmentManager ..

标签: android android-fragments android-fragmentactivity fragment-tab-host


【解决方案1】:

android:clickable="true" 添加到新标签的根布局。它将阻止点击事件通过后面的布局。

【讨论】:

  • 但是为什么旧片段还在?代码 sn-p 表示他们正在调用 replace 而不是 add,这应该会导致首先删除现有的片段。
  • 是的..它不能在那里。但我不知道为什么它仍然收到点击事件。
  • @minipf 它会阻止任何类型的标签小部件点击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多