【问题标题】:Disable back press in fragment?在片段中禁用后按?
【发布时间】:2017-04-20 05:42:51
【问题描述】:

我有一个活动 Main Activity 有两个片段 ListFragmentDetailFragment 。当我在 __Detail Fragment 上时,我不希望后按两次。

主要活动

 @Override
public void onBackPressed() {
    if (!isViewClicked) {
        isViewClicked = true;
        super.onBackPressed();
    }

在这里,我只是试图阻止按下后退按钮两次。 但这似乎不起作用。 这里的阻塞是指,一旦按下,从细节到列表。如果按下另一个应用程序会最小化,这是我不希望发生的。

【问题讨论】:

  • 阻止按两次返回按钮是什么意思?请详细说明。
  • @Manoj 如果按详细信息片段上的返回按钮,您想去哪里?
  • @tahsinRupam 我添加了描述
  • @manoj 如果我理解正确,您想在按详细信息片段上的返回按钮时关闭应用程序吗?
  • 按下后,从详细信息到列表。如果按下另一个应用程序会最小化,这是我不希望发生的。

标签: android android-fragments fragmenttransaction onbackpressed


【解决方案1】:

如果您的Activity 中有DetailFragment 的实例,您可以使用片段的isAdded() 方法来检查它当前是否已添加到您的Activity

为了找到片段的实例,可以使用

getSupportFragmentManager().findFragmentByTag(TAG);

getSupportFragmentManager().findFragmentById(ID);

【讨论】:

  • 我检查了片段是否为空。问题依然存在
  • 如果不是null检查,是否添加到activity中。
【解决方案2】:

我没有完全理解你,但我给了你我在项目中使用的技巧。我在你的代码中编辑它。我不知道什么是 isViewClicked。但 请检查它是否对您有用。

@Override
    public void onBackPressed() {
        int count = this.getSupportFragmentManager().getBackStackEntryCount();
        if(count != 0)
        {
            //Do your stuff
        }else if (!isViewClicked) {
            isViewClicked = true;
            super.onBackPressed();
        }
    }

【讨论】:

  • @Manoj Frekzz,你试过这个吗?
【解决方案3】:

只需将此添加到包含您的ListFragmentDetailedFragment 的活动中。从ListFragment 中删除onBackPressed()

@Override
public void onBackPressed() {

}

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    好的,我试着理解你的问题。据我了解

    你有 Activity A - List Fragment > Detail Fragment。

    当您按下 Detail Fragment 上的返回按钮时,您将返回 List Fragment,这就是您所需要的。 但从 List Fragment 再次按返回按钮不应关闭/退出您的应用。

    所以这是你需要做的。

    像这样将列表片段添加到 MainActivity

        private FragmentManager mFragmentManager;
        private FragmentTransaction mFragmentTransaction;
        Fragment listFragment;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    //Listfragment here
            listFragment = new ListFragment();
            mFragmentManager = getSupportFragmentManager();
            mFragmentTransaction = mFragmentManager.beginTransaction();
            mFragmentTransaction.replace(R.id.frame, listFragment, "List");
            mFragmentTransaction.addToBackStack("List");
            mFragmentTransaction.commit();    }
    

    在 List Fragment 中以同样的方式调用 Detail Fragment,例如:

    mListview.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Fragment detailFragment = new DetailFragment();
                    mFragmentManager = getFragmentManager();
                    mFragmentTransaction = mFragmentManager.beginTransaction();
                    mFragmentTransaction.replace(R.id.frame, detailFragment, "Detail");
                    mFragmentTransaction.addToBackStack("Detail");
                    mFragmentTransaction.commit();
                }
            });
    

    在你MainActivity

      @Override
        public void onBackPressed() {
            if(listFragment.isVisible()){
                **//Do Nothing - DOES NOT CLOSE THE APP**
            }
            else{
                super.onBackPressed();
            }
        }
    

    注意

    除非你有充分的理由,否则请不要这样做,因为打破预期的运营模式会对整个平台造成轻微的伤害

    【讨论】:

      【解决方案5】:

      如果您不想最小化您的应用程序,您应该在MainActivityListFragement 中编写以下代码,但我建议MainActivity

      @Override
          public void onBackPressed() {
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 2022-12-22
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        相关资源
        最近更新 更多