【问题标题】:How to implement android Toolbar Back button如何实现android工具栏后退按钮
【发布时间】:2016-05-19 14:58:30
【问题描述】:

我正在使用自定义工具栏。我需要添加返回按钮。现在我正在使用此代码添加后退按钮。

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        toolbar.setBackgroundColor(getResources().getColor(R.color.white));
        toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow));
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });

这很好用。我可以看到添加了后退按钮。但是考虑一下我在没有后退按钮的 Fragment1 中的情况。现在我转到 Fragment2 并添加后退按钮。从 Fragment 2 我打开 Fragment 3 并再次添加后退按钮。

现在,当我从 Fragment3 按下返回按钮返回到 Fragment2 时,我必须检查 Fragment Stack 以查看 Fragment 2 中是否需要返回按钮。

当我们将片段推入堆栈时,有没有其他方法可以自动处理后退按钮?

【问题讨论】:

  • 你能让我更清楚你到底想要什么吗?

标签: android android-toolbar android-navigation


【解决方案1】:

只需添加两行新代码。像这样的

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
toolbar.setBackgroundColor(getResources().getColor(R.color.white));
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow));

setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

【讨论】:

    【解决方案2】:

    假设您正在使用 AppCompatActivity

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);        
            setContentView(R.layout.activity_main);
    
            toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
            setSupportActionBar(toolbar);
    
            // enabling action bar app icon and behaving it as toggle button
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
       }
    

    然后在 onOptionsItemSelected 你可以覆盖主页按钮如下:

     @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
            else if(id == android.R.id.home){
                Intent i= new Intent(this, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
                finish();
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    

    【讨论】:

    • 工具栏为什么需要 onOptionsItemSelected
    【解决方案3】:

    您可以非常轻松地处理后退图标。如果您的所有片段都在单个 Activity 中,我真的建议您使用以下方式处理此问题:

    首先创建一个实现FragmentManager .OnBackStackChangedListener 的抽象BaseFragment 类,然后在其中放入以下方法:

      @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mainActivity = (MainActivity) getActivity();
    
            getFragmentManager().addOnBackStackChangedListener(this);
    
            shouldDisplayHomeUp();
        }
    
        @Override
        public void onBackStackChanged() {
            shouldDisplayHomeUp();
        }
    
    
        public boolean shouldDisplayHomeUp() {
            //Enable Up button only  if there are entries in the back stack
            boolean canBack = false;
            try {
                canBack = getFragmentManager().getBackStackEntryCount() > 0;
            } catch (Exception ex) {
    //            Log.e(getClass().getCanonicalName(), ex.getMessage());getMessage
            }
    
            if (canBack) {
                mainActivity.drawerDisable();
            } else {
                mainActivity.drawerEnable();
            }
            return canBack;
        }
    

    通过这种方式,disableDrawerenableDrawer 函数处理您的图标,OnBackPressed 方法处理您的 BackStack 现在在您的活动中,如果需要,当您按下后退图标显示时。你的onBackPressed 应该是这样的:

     int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
    
                if (backStackCount == 0) {
                    //nothing exist in backStack OS handle it
                    super.onBackPressed();
                } else {
    
                    getSupportFragmentManager().popBackStack();
    }
    

    查看完整实现here

    【讨论】:

    • 感谢您的回答。你知道为什么从堆栈中移除片段时会多次调用 onBackStackChanged 吗?
    • 我认为这是由于 BackStack push/pop 但我不确定。
    【解决方案4】:

    在你的活动中使用方法

    private void setupToolbar(){
      Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
           setSupportActionBar(toolbar);
           ActionBar actionBar=getSupportActionBar();
           actionBar.setDisplayHomeAsUpEnabled(true);
           actionBar.setDisplayShowHomeEnabled(true);
           toolbar.setNavigationOnClickListener(new View.OnClickListener() {
       @Override
              public void onClick(View v) {  
               finish();  
                 }
                   });
                  }
    

    【讨论】:

    • 虽然答案可能只是代码,但最好解释一下您所做的事情,这在将来也会为您的答案增加价值
    【解决方案5】:

    它适用于工具栏的后按功能

    private setUpToolBar() {
    
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    
    setSupportActionBar(toolbar);
    
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    
    @Override
    
    public void onClick(View v) {
    
    onBackPressed();
    
    }
    
    });
    
    }
    

    【讨论】:

    • 请正确编辑您的代码并添加一些解释。
    【解决方案6】:

    我有主要活动和四个片段。 在 MainActivity 我写了这段代码

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
    
            }
        });
    

    这工作正常,如果你有片段然后创建一个 onBackPressed() 方法

    @Override
    public void onBackPressed() {
        int position = mViewPager.getCurrentItem();
        if(position == 2) { // go back to search / result tab from info detail tab
            mViewPager.setCurrentItem(2);
        } else if(position == 0) { // switch from result to search tab or go back to home tab
            SectionsPagerAdapter sectionsPagerAdapter = (SectionsPagerAdapter) mViewPager.getAdapter();
            Fragment fragment = sectionsPagerAdapter.getItem(position);
            if(fragment instanceof ResultFragment) {
                Bundle bundle = ((ResultFragment) fragment).getArguments();
                if(bundle != null) {
                    sectionsPagerAdapter.replaceFragment(SearchFragment.newInstance(bundle.getString(GlobalInfo.TAG_ID), bundle.getString(GlobalInfo.PART_NO), bundle.getString(GlobalInfo.SERIAL_NO), bundle.getString(GlobalInfo.PART_NAME)), getString(R.string.search), 0);
                }
            } else {
                mViewPager.setCurrentItem(1);
            }
        }
        else if(position == 3){
            SectionsPagerAdapter sectionsPagerAdapter = (SectionsPagerAdapter) mViewPager.getAdapter();
            Fragment fragment = new ToolMgtFragment();
            sectionsPagerAdapter.replaceFragment(fragment,"Tool Mgt", 3);
        }
        else {
            super.onBackPressed();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2012-04-23
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多