【问题标题】:ActionBarDrawerToggle not showing the correct iconsActionBarDrawerToggle 没有显示正确的图标
【发布时间】:2016-01-20 20:34:18
【问题描述】:

我正在关注http://developer.android.com/training/implementing-navigation/nav-drawer.html 上的教程,但在使用 ActionBarDrawerToggle 时遇到问题。该文档使用 v4,但由于已弃用,因此我正在尝试使用 v7。

我的问题是我无法显示抽屉/汉堡图标,但它总是显示向上箭头,即使我在清单中没有父母的主要活动上也是如此。

这是我的主要活动:

import android.app.Activity;
import android.app.Fragment;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.example.R;

public class MainActivity extends Activity
{
    private static final String LOG_TAG = MainActivity.class.getName();

    private String[] menuItems;
    private DrawerLayout drawerLayout;
    private ListView drawerList;
    private ActionBarDrawerToggle drawerToggle;

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

        if (findViewById(R.id.fragment_container) != null) {
            if (savedInstanceState != null) {
                return;
            }

            menuItems = getResources().getStringArray(R.array.menu_items);
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawerList = (ListView) findViewById(R.id.menu);

            drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.menu_list_item, menuItems));
            drawerList.setOnItemClickListener(new DrawerItemClickListener());

            drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

            drawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                R.string.drawer_open,
                R.string.drawer_close
            ) {
                public void onDrawerClosed(View view) {
                    super.onDrawerClosed(view);
                    invalidateOptionsMenu();
                }

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

            drawerLayout.setDrawerListener(drawerToggle);

            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);

            LoginFragment loginFragment = new LoginFragment();
            getFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, loginFragment).commit();
        }
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState)
    {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void selectMenuItem(int position)
    {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new DialFragment();
            break;
            case 1:
                fragment = new NumbersFragment();
            break;
            case 2:
                fragment = new LoginFragment();
            break;
        }

        getFragmentManager()
            .beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .commit();

        drawerList.setItemChecked(position, true);
        drawerLayout.closeDrawer(drawerList);
    }

    private class DrawerItemClickListener implements ListView.OnItemClickListener
    {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id)
        {
            selectMenuItem(position);
        }
    }
}

当我改变它的工作:

import android.support.v7.app.ActionBarDrawerToggle;

import android.support.v4.app.ActionBarDrawerToggle;

当我改变时:

    drawerToggle = new ActionBarDrawerToggle(
        this,
        drawerLayout,
        R.string.drawer_open,
        R.string.drawer_close
    )

        drawerToggle = new ActionBarDrawerToggle(
            this,
            drawerLayout,
            R.drawable.ic_drawer, 
            R.string.drawer_open,
            R.string.drawer_close
        )

在这些更改之后,我可以看到一个正确的汉堡包图标,该图标在抽屉打开/关闭时会折叠/展开,但我希望 v7 能够正常工作。有什么想法吗?

编辑:刚刚在我的手机上尝试过(运行 Android 5.0.1),当抽屉关闭时显示汉堡图标,打开时动画成箭头。我使用的模拟器是 API 15 / Android 4.0.3

【问题讨论】:

  • 您将 v4 更改为 v7 还是将 v7 更改为 v4?那部分不清楚
  • 抱歉,当我将 v7 更改为 v4 时,它可以工作(但已弃用)。更新了主帖。
  • 你试过了吗? getActionBar().setDisplayShowHomeEnabled(true);如果你这样做 getActionBar().setDisplayHomeAsUpEnabled(false);汉堡图标应该显示
  • 我尝试这样做时根本没有图标,而且我无法通过单击打开抽屉,只需滑动即可。
  • 我会建议你使用工具栏,因为这就是 android 现在所建议的。如果您有兴趣,可以帮助您。我最近用回收器查看器做了一个

标签: android


【解决方案1】:

由于 ActionBarDrawerToggle 有两个不同的 Signature 但构造函数的名称相同,并且您使用了带有 4 个参数的构造函数

 drawerToggle = new ActionBarDrawerToggle(
        this,
        drawerLayout,
        R.string.drawer_open,
        R.string.drawer_close
    )

要解决这个问题,你可以使用接受工具栏的构造方法

drawerToggle = new ActionBarDrawerToggle(
            this,yourtoolbar
            drawerLayout,
            R.string.drawer_open,
            R.string.drawer_close
        )

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2018-09-17
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2018-11-02
    相关资源
    最近更新 更多