使用 ScrimInsetFrameLayout 出错

Getting an error using ScrimInsetFrameLayout

我正在使用 ScrimInsetsFrameLayout 获取 ToolBar 上的 Navigation DrawerStatusBar 上的 StatusBar 所以我按照指南阅读了很多相关内容但是即使我没有遗漏任何东西,也有问题。

每当我在 drawer_listViewic_drawer 中单击(四个中的一个)activity 时,应用程序强制关闭 Logcat

MainActivity

public class MainActivity extends ActionBarActivity {

DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
String[] mDrawerListItems;

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

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

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer);
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.primaryDark));
    mDrawerList = (ListView)findViewById(android.R.id.list);
    mDrawerListItems = getResources().getStringArray(R.array.drawer_list);
    mDrawerList.setAdapter(new ArrayAdapter<>
            (this, android.R.layout.simple_list_item_1, mDrawerListItems));
    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            openFragment(position);
        }
    });
    mDrawerToggle = new ActionBarDrawerToggle(this,
            mDrawerLayout,
            toolbar,
            R.string.drawer_open,
            R.string.drawer_close){
        public void onDrawerClosed(View v){
            super.onDrawerClosed(v);
            invalidateOptionsMenu();
            syncState();
        }
        public void onDrawerOpened(View v){
            super.onDrawerOpened(v);
            invalidateOptionsMenu();
            syncState();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerToggle.syncState();
}

protected void openFragment(int position){

    mDrawerLayout.closeDrawer(mDrawerList);

    switch (position) {
        case 0:
            startActivity(new Intent(this, WIND.class));
            break;
        case 1:
            startActivity(new Intent(this, GEO.class));
            break;
        case 2:
            startActivity(new Intent(this, COMPASS.class));
            break;
        case 3:
            startActivity(new Intent(this, BARO_ALTI.class));
            break;
        default:
            break;
    }

}

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

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

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case android.R.id.home: {
            if (mDrawerLayout.isDrawerOpen(mDrawerList)){
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                mDrawerLayout.openDrawer(mDrawerList);
            }
            return true;
        }
        default: return super.onOptionsItemSelected(item);
    }
}

my_activity.xml:

<?xml version="1.0"?>
<android.support.v4.widget.DrawerLayout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/drawer"
    tools:context=".MainActivity"
    android:fitsSystemWindows="true">

<FrameLayout
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <android.support.v7.widget.Toolbar
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        app:popupTheme="@style/Theme.AppCompat"
        app:theme="@style/ToolbarTheme"
        android:background="@color/primary"
        android:id="@+id/toolbar"/>

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

    </FrameLayout>

</FrameLayout>

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearLayout"
    android:layout_width="304dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:insetForeground="#4000">

    <ListView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="#ffffffff"
        android:divider="#ffffffff"
        android:dividerHeight="8dp"
        android:id="@android:id/list"
        android:layout_gravity="start"
        android:scrollbars="none"/>

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout>

我的问题仅限于 my_activity.xml。 请帮助我,我无法继续我的项目。

[更新]

我的布局和他做的一模一样https://github.com/google/iosched/blob/master/android/src/main/res/layout/activity_map.xml但是**为什么我没有得到相同的结果?! **

<?xml version="1.0"?>
<android.support.v4.widget.DrawerLayout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/drawer"
    tools:context=".MainActivity"
    android:fitsSystemWindows="true">

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    app:insetForeground="#4000">

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

    </FrameLayout>

    <android.support.v7.widget.Toolbar
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        app:popupTheme="@style/Theme.AppCompat"
        app:theme="@style/ToolbarTheme"
        android:background="@color/primary"
        android:id="@+id/toolbar"/>

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout>

<ListView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="#ffffffff"
        android:divider="#ffffffff"
        android:dividerHeight="8dp"
        android:id="@android:id/list"
        android:layout_gravity="start"
        android:scrollbars="none"/>

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

在样式中将 windowActionBar 设置为 true 试试这个,导航应该在

下方
<?xml version="1.0"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


<android.support.v7.widget.Toolbar
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="?attr/actionBarSize"
    android:layout_width="match_parent"
    app:popupTheme="@style/Theme.AppCompat"
    app:theme="@style/ToolbarTheme"
    android:background="@color/primary"
    android:id="@+id/toolbar"/>


<android.support.v4.widget.DrawerLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/drawer"
    tools:context=".MainActivity"
    >

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >      

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

</LinearLayout>

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/linearLayout"
   android:layout_width="304dp"
   android:layout_height="match_parent"
   android:layout_gravity="start"
   app:insetForeground="#4000">

  <ListView
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="#ffffffff"
    android:divider="#ffffffff"
    android:dividerHeight="8dp"
    android:id="@android:id/list"
    android:layout_gravity="start"
    android:scrollbars="none"/>

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout>

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

</LinearLayout>


[更新]

根据 Android 文档:

public void  syncState () 

这应该从您的 Activity 的 onPostCreate 方法调用,以便在恢复 DrawerLayout 的实例状态后以及状态可能以 ActionBarDrawerToggle 未恢复的方式发生分歧的任何其他时间进行同步通知。 (例如,如果您在一段时间内停止转发适当的抽屉事件。)

那么你能不能试着把你所有其他的电话都删掉syncState()

简单地把setSupportActionBar(toolbar);放在Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);

下面

现在您应该可以点击 ic_drawer 打开 drawer_layout

(您将无法点击该列表中的 activity,我会尝试解决该问题。我会在明天更新我的答案)

编辑:

public class MainActivity extends ActionBarActivity {

DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
String[] mDrawerListItems;

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

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

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer);
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.primaryDark));

    mDrawerListItems = getResources().getStringArray(R.array.drawer_list);

    mDrawerList = (ListView)findViewById(android.R.id.list);
    mDrawerList.setAdapter(new ArrayAdapter<>
            (this, android.R.layout.simple_list_item_1, mDrawerListItems));
    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            openFragment(position);
        }
    });
    mDrawerToggle = new ActionBarDrawerToggle(this,
            mDrawerLayout,
            toolbar,
            R.string.drawer_open,
            R.string.drawer_close){
        public void onDrawerClosed(View v){
            super.onDrawerClosed(v);
            invalidateOptionsMenu();
            syncState();
        }
        public void onDrawerOpened(View v){
            super.onDrawerOpened(v);
            invalidateOptionsMenu();
            syncState();
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState();
}

protected void openFragment(int position){

    Intent intent;
    switch (position) {
        case 0:
            intent = new Intent(this, Activity1.class);
            break;
        case 1:
            intent = new Intent(this, Activity2.class);
            break;
        case 2:
            intent = new Intent(this, Activity3.class);
            break;
        case 3:
            intent = new Intent(this, Activity4.class);
            break;
        default:
            intent = null;
    }
    startActivity(intent);
    //mDrawerLayout.closeDrawer(mDrawerList);    

}

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

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

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case android.R.id.home: {
            if (mDrawerLayout.isDrawerOpen(mDrawerList)){
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                mDrawerLayout.openDrawer(mDrawerList);
            }
            return true;
        }
        default: return super.onOptionsItemSelected(item);
    }
}