【问题标题】:Toolbar empty with Navigation Drawer带有导航抽屉的工具栏为空
【发布时间】:2016-02-01 03:55:13
【问题描述】:

我的BaseDrawerActivity 扩展了BaseActivity,我在BaseActivity 中有一个Toolbar

工具栏在扩展 BaseActivity 的类中显示没有问题,但所有扩展 BaseDrawerActivity 的类只显示一个空白工具栏。导航抽屉工作正常。

当我有一个主要活动类(BaseActivity + BaseDrawerActivity)时,工具栏显示没有问题,并且导航抽屉工作。

为什么我在这里的实现没有显示Toolbar?我调试了,getToolbar() 肯定会返回工具栏。

activity_base_drawer.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/toolbar"/>

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:foreground="?android:windowContentOverlay">

            <FrameLayout
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

            <include layout="@layout/call_to_action_banner"/>

        </FrameLayout>

        <ListView
            android:id="@+id/navigation_drawer"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            style="@style/NavDrawerListView" />

    </android.support.v4.widget.DrawerLayout>

</LinearLayout>

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:theme="@style/ToolbarOverlay"
    android:popupTheme="@style/ToolbarOverlay"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:minHeight="?attr/actionBarSize"
    android:elevation="10dp"/>

BaseDrawerActivity

public abstract class BaseDrawerActivity extends BaseActivity {

    private static final int LAYOUT_ID = R.layout.activity_base_drawer;

    private DrawerLayout mDrawerLayout;

    private ActionBarDrawerToggle mDrawerToggle;
    private NavDrawerAdapter mNavDrawerAdapter;

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

    @Override
    public void onBackPressed() {
        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)){
            mDrawerLayout.closeDrawers();
        } else {
            super.onBackPressed();
        }
    }

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(LAYOUT_ID);

        setupNavDrawer();
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    private void setupNavDrawer() {
        final ListView navDrawerListView = (ListView) findViewById(R.id.navigation_drawer);

        View header = getLayoutInflater().inflate(R.layout.nav_drawer_header, null, false);
        mNavDrawerAvatarImageView = (ImageView) header.findViewById(R.id.avatar);
        mNavDrawerUsernameTextView = (CustomTextView) header.findViewById(R.id.username);
        navDrawerListView.addHeaderView(header);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                mDrawerLayout,
                getToolbar(),
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                updateNavDrawerUserInfo();
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mNavDrawerAdapter = new NavDrawerAdapter(this);
        navDrawerListView.setAdapter(mNavDrawerAdapter);
        navDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                mDrawerLayout.closeDrawer(GravityCompat.START);
                onNavigationDrawerItemSelected(position);
            }
        });

        updateNavDrawerUserInfo();
    }

    private void updateNavDrawerUserInfo() {
        final DatabaseHelper db = DatabaseHelper.getInstance(this);
        if (db.doesUserExist(SharedPrefs.getUserId())) {
            final User currentUser = db.getUser(SharedPrefs.getUserId());

            if (currentUser != null) {
                if (currentUser.getAvatarType() != null) {
                    try {
                        mNavDrawerAvatarImageView.setImageDrawable(getResources().getDrawable(
                                ViewUtil.getAvatarHeadDrawableId(this,
                                        currentUser.getAvatarType())));
                    } catch (Resources.NotFoundException e) {
                        e.printStackTrace();
                    }
                }

                if (currentUser.getUsername() != null) {
                    mNavDrawerUsernameTextView.setText(currentUser.getUsername());
                }
            }
        }
    }
}

基础活动

private void setupToolbar() {
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    if (getSupportActionBar() != null) {
        getSupportActionBar().setTitle("");
        getSupportActionBar().setSubtitle("");
        getSupportActionBar().setLogo(R.drawable.logo_toolbar);
    }

    mUpdatingSpinner = (ProgressBar) getLayoutInflater().inflate(
            R.layout.toolbar_updating_spinner, null, false);
    int dpInPixels = (int) getResources().getDimension(R.dimen.toolbar_updating_spinner);
    Toolbar.LayoutParams spinnerLp = new Toolbar.LayoutParams(dpInPixels, dpInPixels,
            Gravity.END);
    mToolbar.addView(mUpdatingSpinner, spinnerLp);
}

【问题讨论】:

  • 请出示AndroidManifest.xmlstyles.xml

标签: android android-toolbar navigation-drawer


【解决方案1】:

虽然不完全明白,但我找到了答案。

在我打电话给setupNavDrawer() 之前,我基本上在我的BaseDrawerActivity 中再次打电话给setupToolbar(),出于某种原因,这解决了它。

我认为从BaseActivityToolbar 的引用没有正确检索(即使我已调试并且它有对它的引用)。我尝试的另一件事是在设置导航抽屉之前setSupportActionBar(mToolbar),但这没有用。

如果有人对我为什么必须重新设置工具栏以使其显示有任何想法,我会很高兴听到它!

【讨论】:

  • Android 开发者核心团队,请进这个。许多人正在努力让 Toolbar 取代 ActionBar,问题通常是 ToolBar 是空的。它在那里,但是是空的。怎么办?
【解决方案2】:

转到AndroidManifest.xml 文件并替换

android:theme="@style/AppTheme"

android:theme="@android:style/Theme.Holo.Light.DarkActionBar"

【讨论】:

  • 我的AppTheme 风格是:
【解决方案3】:

你必须使用setSupportActionBar(Toolbar toolbar).

This question 应该会有所帮助。

【讨论】:

  • 我在我的BaseActivity 中使用setSupportActionBar。编辑我的帖子以包含我的 Toolbar 设置方法的代码。请记住,工具栏在扩展 BaseActivity 的类中工作。这只是BaseDrawerActivitys。
  • 你确定一切最终都继承自 ActionBarActivity
  • 是的,我的 BaseActivity 扩展自 AppCompatActivity
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 2019-09-15
  • 1970-01-01
  • 2015-02-26
  • 2015-01-15
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多