使用ScrimInsetFrameLayout获取错误

时间:2015-04-06 00:36:40

标签: java android navigation-drawer toolbar material-design

我正在使用ScrimInsetsFrameLayout获取Navigation Drawer ToolBarStatusBar的{​​{1}}所以我按照指南阅读了很多相关内容但是有一些东西即使我没有遗漏任何东西也是错的。

每当我点击drawer_listViewic_drawer中的一个(四个)活动时,app力就会在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>

3 个答案:

答案 0 :(得分:4)

只需将setSupportActionBar(toolbar);放在Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);

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

(你将无法点击该列表的活动,我会尝试解决这个问题。明天我会更新我的答案)

修改

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);
    }
}

答案 1 :(得分:1)

使样式中的windowActionBar为true 试试这个,导航应该在

下面

答案 2 :(得分:-1)

<?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 doc:

public void  syncState () 

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

所以你可以尝试删除所有其他电话syncState()