【问题标题】:how to control the back navigation button in a activity如何控制活动中的后退导航按钮
【发布时间】:2015-02-12 11:37:22
【问题描述】:

我已经实现了一个带有可滑动视图的选项卡布局,它有 5 个选项卡。 在我的第一个四个选项卡中,我加载了网格菜单。如果我在 da 网格中选择其中一项,它将打开一个新活动。

在我的 manifest.xml 文件中,我使用这一行将其导航回来。

android:parentActivityName="xxxxxxx.ActivityMenuGrid"

当我在第二个、第三个或第四个选项卡中选择一个项目并按下屏幕左上角的后退导航按钮时,它将返回并打开并显示第一个选项卡,而不是我选择的选项卡所需的项目。 但如果我按下手机中的后退按钮,它会将我导航回打开新活动的选项卡。 如何将左上角的后退导航导航到相应的选项卡。

public class ActivityMenuGrid extends FragmentActivity implements
        ActionBar.TabListener {

    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    public TabHost myTabHost;

    // Tab titles
    private String[] tabs = { "", "", "", "", "" };

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

        // Initilization
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setDisplayUseLogoEnabled(true);

        actionBar.addTab(actionBar.newTab().setTabListener(this)
                .setIcon(R.drawable.ic_tab_p));
        actionBar.addTab(actionBar.newTab().setTabListener(this)
                .setIcon(R.drawable.ic_tab_n));
        actionBar.addTab(actionBar.newTab().setTabListener(this)
                .setIcon(R.drawable.ic_tab_s));
        actionBar.addTab(actionBar.newTab().setTabListener(this)
                .setIcon(R.drawable.ic_tab_pr));
        actionBar.addTab(actionBar.newTab().setTabListener(this)
                .setIcon(R.drawable.ic_tab_pro);
        ActionBar bar = getActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        // set background for action bar tab
        bar.setStackedBackgroundDrawable(new ColorDrawable(Color
                .parseColor("#f8f8f8")));
        bar.show();

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);


            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

    }

    public void onBackPressed() {
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_main_actions, menu);

        // Associate searchable configuration with the SearchView

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Take appropriate action for each action item click
        switch (item.getItemId()) {

        case R.id.action_search:
            // search action
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }

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

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

        // getActionBar().setTitle(tab.getText());
        viewPager.setCurrentItem(tab.getPosition());
    }

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

}

我正在从 tab2 中选择一个项目,

然后它将打开新的活动。它有返回导航按钮。

当我按下返回导航按钮时,它将返回到 tab1,而不是 tab 2。我想解决这个问题并将其导航到 tab2。 仅供参考-当我按下手机中的后退导航硬件按钮时,它将导航到选项卡 2。

任何帮助将不胜感激。

【问题讨论】:

  • 我不明白你想用哪个后退按钮做什么你能添加截图来解释你在做什么这会有所帮助
  • 你能检查我更新的问题吗

标签: android tabs


【解决方案1】:

您必须覆盖活动 onBackPresed 函数,并且必须编写逻辑以移动到“所需的选项卡”。这样做会阻止您的应用关闭(按下后退按钮时的默认导航)与 android 硬件后退按钮,您还必须检查您是否已经在所需的选项卡中并传递事件 super.onBackPressed();到操作系统关闭应用程序或处理默认导航。

【讨论】:

  • 硬件后退按钮工作正常。屏幕导航按钮的问题,你能帮我在 wt 代码级别上做你提到的最重要的部分吗?我用过 onBackPressed()
【解决方案2】:

当您按下后退按钮时,下面的代码说明它正在开始新的活动并且您没有覆盖它。检查一次。

@Override - > Missing.
    public void onBackPressed() {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
        }

我建议进行一次编辑 尝试在 onPageSelected 方法中设置选项卡的位置,然后在按下时检查它的前一个位置并导航到它。 例如:

 static int pos =0;
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
        pos=position;

                    }




     @Override
            public void onBackPressed() {
                try {
                    switch (pos) {
                    case 0: // Means Main Activity : Do Default action
                        super.onBackPressed();
                        break;
                    case 1:
                    case 2:
                    case 3://Other than main tab open previous positioned tab.
                        viewPager.setCurrentItem(pos, true);
                        break;
                    }
                } catch (Exception e) {
                    super.onBackPressed();
                }
            }

我遇到了同样的问题,它对我有用。很高兴能帮助你。

【讨论】:

  • position 在这一行给出错误,viewPager.setCurrentItem(position, true);
  • 我已经更新了答案。请检查。 case 是您的标签位置。这么小心的没有。您拥有的标签页。对于您的情况,可能只有两个。
  • 我试过了,但它没有按我的意愿工作。我仍然得到与earlr相同的输出
  • 当我在选项卡 2 或 3 中时,你的代码会阻止硬件返回导航。我如何更改它,当我在选项卡 2 中并且当我按下返回按钮时,它应该导航到选项卡 1
【解决方案3】:

我做到了,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Take appropriate action for each action item click
        switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多