无法捕获工具栏主页按钮单击事件

新手上路,请多包涵

我已经实现了最新的 appcompat 库并使用 Toolbar 作为操作栏。但问题是我无法捕捉到主页按钮/汉堡图标点击事件。我已经尝试并查看了所有内容,但似乎没有发现类似的问题。

这是我的 Activity 类:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Set up the drawer.
    navDrawerFragment =
        (NavigationDrawerFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_drawer);
    navDrawerFragment.setUp(
        R.id.navigation_drawer,
        (DrawerLayout) findViewById(R.id.drawer_layout),
        toolbar);
}

这是我的 NavigationDrawerFragment 类:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        currentSelectedPosition = savedInstanceState.getInt(
            STATE_SELECTED_POSITION);
        fromSavedInstanceState = true;
    }

    // Select either the default item (0) or the last selected item.
    selectItem(currentSelectedPosition);
}

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Indicate that this fragment would like
    // to influence the set of actions in the action bar.
    setHasOptionsMenu(true);
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        drawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);
        drawerListView.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent,
                View view, int position, long id) {
                selectItem(position);
            }
        });
        //mDrawerListView.setAdapter();
        //mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
        return drawerListView;
}

public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    fragmentContainerView = getActivity().findViewById(fragmentId);
    this.drawerLayout = drawerLayout;

    // set a custom shadow that overlays the main
    // content when the drawer opens
    drawerLayout.setDrawerShadow(
        R.drawable.drawer_shadow, GravityCompat.START);
    // set up the drawer's list view
    // with items and click listener

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the navigation drawer and the action bar app icon.
    drawerToggle = new ActionBarDrawerToggle(
        getActivity(),
        drawerLayout,
        toolbar,
        R.string.navigation_drawer_open,
        R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
        }

        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
        }
    };

    // If the user hasn't 'learned' about the drawer,
    // open it to introduce them to the drawer,
    // per the navigation drawer design guidelines.
    if (!userLearnedDrawer && !fromSavedInstanceState) {
        drawerLayout.openDrawer(fragmentContainerView);
    }

    // Defer code dependent on restoration of previous instance state.
    drawerLayout.post(new Runnable() {
        @Override
        public void run() {
            drawerToggle.syncState();
        }
    });

    drawerLayout.setDrawerListener(drawerToggle);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(STATE_SELECTED_POSITION, currentSelectedPosition);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Forward the new configuration the drawer toggle component.
    drawerToggle.onConfigurationChanged(newConfig);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.d("cek", "item selected");
    if (drawerToggle.onOptionsItemSelected(item)) {
        Log.d("cek", "home selected");
        return true;
    }

    return super.onOptionsItemSelected(item);
}

当我单击菜单项时,会调用日志“选定的项目”。但是当我点击主页按钮时,它会打开导航抽屉,但日志“home selected”永远不会被调用。我也在我的 Activity 中设置了 onOptionsItemSelected 方法,但它仍然没有被调用。

原文由 Dark Leonhart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
2 个回答

如果您想知道单击主页的时间是 AppCompatActivity 那么您应该这样尝试:

首先告诉 Android 你想使用你的 Toolbar 作为你的 ActionBar

 setSupportActionBar(toolbar);

然后将 Home 设置为通过 setDisplayShowHomeEnabled 显示,如下所示:

 getSupportActionBar().setDisplayShowHomeEnabled(true);

最后像往常一样监听 android.R.id.home 上的点击事件:

 @Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
    if (menuItem.getItemId() == android.R.id.home) {
        Timber.d("Home pressed");
    }
    return super.onOptionsItemSelected(menuItem);
}

如果您想知道导航按钮何时在 Toolbar AppCompatActivity 您可以使用这些方法设置导航图标并监听其上的点击事件。导航图标将出现在您的 Toolbar 的左侧,那里曾经是“主页”按钮。

 toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("cek", "home selected");
    }
});

如果您想知道何时单击汉堡包以及何时打开抽屉,您已经通过 onDrawerOpenedonDrawerClosed 监听这些事件,因此您需要查看这些回调是否符合您的要求。

原文由 MrEngineer13 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 MrEngineer13 提供的答案之外,还有另一个可能的原因是在 onOptionsSelected 方法中可能没有捕获到点击事件。您的 DrawerLayout 可能已经覆盖了布局 XML 文件中的 Toolbar 的界面组件。因此,每当您尝试单击主页按钮时,您只单击 DrawerLayout ,而不是位于其下方的主页按钮。

您现在所要做的就是在相应的布局 XML 文件中重新排列您的 Toolbar 以便它不会被任何其他 UI 组件阻止。

以编程方式,我确实尝试在 toolbar ( toolbar.bringToFront() ) 上调用 bringToFront() 方法。但是,在我的应用程序的上下文中,它似乎不是解决方案。

原文由 Muhammad Faheem Mohd Ezani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题