繁体   English   中英

android状态栏隐藏导航器

[英]android statusbar hiding navigationdrawer

我有一个带有以下代码的导航抽屉:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
    android:fitsSystemWindows="true"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:openDrawer="start">


    <!--<android.support.design.widget.AppBarLayout android:layout_height="wrap_content"-->
        <!--android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">-->

        <!--<android.support.v7.widget.Toolbar android:id="@+id/toolbar"-->
            <!--android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"-->
            <!--android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />-->

    <!--</android.support.design.widget.AppBarLayout>-->

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


    <!--<android.support.design.widget.AppBarLayout android:layout_height="wrap_content"-->
        <!--android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">-->

    <!--</android.support.design.widget.AppBarLayout>-->

    <!--<include-->
        <!--layout="@layout/app_bar_home_page"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent" />-->

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_home_page"
        app:menu="@menu/activity_home_page_drawer"
        app:insetForeground="#4000"/>

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

我也设置了我的风格v21

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="windowActionModeOverlay">true</item>
</style>

但我的问题是,操作栏总是在我的导航器上,隐藏他的顶部。 这是一个截图:

在此输入图像描述

如您所见,我的操作栏隐藏了导航抽屉。

我怎么解决这个问题? 任何帮助将不胜感激。

谢谢大家

PS:

这就是我想要实现的,它是我在网上找到的第一个图像。 在此输入图像描述

编辑:请注意图片,我的目标是“重复”不一样。 他想将自己的列表设置在标题下方,我想用抽屉隐藏状态栏

EDIT2:

我回到原点,现在导航抽屉就在actionBar下面。 这是我的java代码:

public class HomePageActivity extends AppCompatActivity implements IHomePage {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    private ActionBarDrawerToggle mDrawerToggle;
    private ActionBar ab;

    private boolean isDetail = false;
    private int lastSelected = 0;

    @Override
    protected void onResume() {
        super.onResume();

        if(mDrawerToggle != null) {
            mDrawerToggle.syncState();
        }

        if(navigationView != null){
            navigationView.getMenu().getItem(0).setChecked(true);
        } else{
            initDrawer();
            navigationView.getMenu().getItem(0).setChecked(true);
        }
    }

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

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        initActionBar() ;
        initDrawer();

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        PreferitiFragment fragment = new PreferitiFragment();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.commit();

        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    private void initActionBar() {
        ab = getSupportActionBar();
        if (ab == null) {
            Toast.makeText(this, "no", Toast.LENGTH_SHORT).show();
            return;
        }
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);


    }

    private void initDrawer() {

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                int id = item.getItemId();
                lastSelected = id;

                switch (id){
                    case R.id.nav_favorite:
                        setFragment(new PreferitiFragment());
                        break;

                    case R.id.nav_search:
                        setFragment(new CercaPaeseFragment());
                        break;

                    case R.id.nav_settings:
                        setFragment(new ImpostazioniFragment());
                        break;

                    case R.id.nav_guida:
                        setFragment(new GuidaFragment());
                        break;
                    default:
                        setFragment(new PreferitiFragment());
                        break;
                }

                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return true;
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close
        ) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);

                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }


        };
        drawerLayout.setDrawerListener(mDrawerToggle);
    }

    @Override
    public void showDetails(UUID idPharmacy) {

        isDetail = true;
        setFragment(new DettagliFragment());
    }

    @Override
    public void onBackPressed() {
        if (isDetail) {
            if(lastSelected == R.id.nav_search) {
                setFragment(new CercaPaeseFragment());
            } else if(lastSelected == R.id.nav_favorite){
                setFragment(new PreferitiFragment());
            }
        } else {
            super.onBackPressed();
        }
    }

    private void setFragment(Fragment fragment){


        IMyFragments iMyFragments = (IMyFragments) fragment;
        ab.setTitle(iMyFragments.getTitle());

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.commit();
    }
}

这是我的主页布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">

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

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_home_page"
        app:menu="@menu/activity_home_page_drawer" />

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

android.support.v4.widget.DrawerLayout你可以尝试添加

android:paddingTop="?attr/actionBarSize"

这是一个simalar问题Android导航抽屉和windowActionBarOverlay = true

或者您可以隐藏操作栏

来自https://stackoverflow.com/a/22891560/1815624

非常简单。

 getActionbar().hide(); getActionbar().show(); 

关于分隔符的最后一部分

 <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/darker_gray"/> 

要添加垂直分隔符,请切换layout_width和layout_height值

或者将抽屉放在ActionbBar的顶部,您可以尝试以下答案:

https://stackoverflow.com/a/26174941/1815624

以下是您执行此操作的一些详细步骤。

首先,创建一个名为“decor.xml”的xml或任何你喜欢的东西。 只放入DrawerLayout和抽屉。下面的“FrameLayout”只是一个容器。 我们将用它来包装您活动的内容。

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout ...> <FrameLayout android:id="@+id/container" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <fragment android:name="com...." android:layout_gravity="start" android:id="@id/navigation" android:layout_width="@dimen/navigation_menu_width" android:layout_height="fill_parent" /> </android.support.v4.widget.DrawerLayout> 

然后删除主布局中的DrawerLayout。 现在主要活动的布局应该是这样的

 <RelativeLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> ... </RelativeLayout> 

我们假设主要活动的布局名为“main.xml”。

在您的MainActivity中,写如下:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Inflate the "decor.xml" LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.decor, null); // "null" is important. // HACK: "steal" the first child of decor view ViewGroup decor = (ViewGroup) getWindow().getDecorView(); View child = decor.getChildAt(0); decor.removeView(child); FrameLayout container = (FrameLayout) drawer.findViewById(R.id.container); // This is the container we 

刚刚定义。 container.addView(孩子);

  // Make the drawer replace the first child decor.addView(drawer); // Do what you want to do....... } 

现在你有一个可以在ActionBar上滑动的DrawerLayout。 但您可能会发现状态栏覆盖了它。 您可能需要向Drawer添加paddingTop才能解决问题。

这不是理想的但它应该可以帮助你...白色是抽屉,黑色是主要内容,蓝色是标题栏....

在此输入图像描述

public class HomePageActivity extends AppCompatActivity {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    private ActionBarDrawerToggle mDrawerToggle;
    private ActionBar ab;

    private boolean isDetail = false;
    private int lastSelected = 0;

    @Override
    protected void onResume() {
        super.onResume();

        if(mDrawerToggle != null) {
            mDrawerToggle.syncState();
        }

//        if(navigationView != null){
//            navigationView.getMenu().getItem(0).setChecked(true);
//        } else{
//            initDrawer();
//            navigationView.getMenu().getItem(0).setChecked(true);
//        }
    }

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

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        initActionBar() ;
        initDrawer();

//        FragmentManager fragmentManager = getFragmentManager();
//        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//        PreferitiFragment fragment = new PreferitiFragment();
//        fragmentTransaction.add(R.id.content_frame, fragment);
//        fragmentTransaction.commit();

        mDrawerToggle.syncState();

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        navigationView = (NavigationView) findViewById(R.id.nav_view);
        DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.drawer_layout, null);

        // HACK: "steal" the first child of decor view
        ViewGroup decor = (ViewGroup) getWindow().getDecorView();
        View child = decor.getChildAt(0);
        decor.removeView(child);
        FrameLayout container = (FrameLayout) drawer.findViewById(R.id.content_frame); // This is the container we defined just now.
        container.addView(child);
        decor.addView(drawer);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    private void initActionBar() {
        ab = getSupportActionBar();
        if (ab == null) {
            Toast.makeText(this, "no", Toast.LENGTH_SHORT).show();
            return;
        }
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);


    }

    private void initDrawer() {

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                int id = item.getItemId();
                lastSelected = id;

//                switch (id){
//                    case R.id.nav_favorite:
//                        setFragment(new PreferitiFragment());
//                        break;
//
//                    case R.id.nav_search:
//                        setFragment(new CercaPaeseFragment());
//                        break;
//
//                    case R.id.nav_settings:
//                        setFragment(new ImpostazioniFragment());
//                        break;
//
//                    case R.id.nav_guida:
//                        setFragment(new GuidaFragment());
//                        break;
//                    default:
//                        setFragment(new PreferitiFragment());
//                        break;
//                }

                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return true;
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                android.R.drawable.ic_btn_speak_now,
                R.string.open,
                R.string.close
        ) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);

                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }


        };
        drawerLayout.setDrawerListener(mDrawerToggle);
    }

//    @Override
//    public void showDetails(UUID idPharmacy) {
//
//        isDetail = true;
//        setFragment(new DettagliFragment());
//    }

//    @Override
//    public void onBackPressed() {
//        if (isDetail) {
//            if(lastSelected == R.id.nav_search) {
//                setFragment(new CercaPaeseFragment());
//            } else if(lastSelected == R.id.nav_favorite){
//                setFragment(new PreferitiFragment());
//            }
//        } else {
//            super.onBackPressed();
//        }
//    }

//    private void setFragment(Fragment fragment){
//
//
//        IMyFragments iMyFragments = (IMyFragments) fragment;
//        ab.setTitle(iMyFragments.getTitle());
//
//        FragmentManager fragmentManager = getFragmentManager();
//        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//        fragmentTransaction.add(R.id.content_frame, fragment);
//        fragmentTransaction.commit();
//    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM