【问题标题】:Action Bar title and navigation drawer icon missing缺少操作栏标题和导航抽屉图标
【发布时间】:2018-12-20 09:48:51
【问题描述】:

MainPage 中,有NavigationDrawerBottomNavigationBar。当我点击Home 时,导航抽屉图标和操作栏标题不见了。

主页

public class MainPage extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        navigation.setSelectedItemId(R.id.navigation_home);
    }


    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment;
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    fragment = new HomePage();
                    loadFragment(fragment);
                    return true;
                case R.id.navigation_dashboard:
                    return true;
                case R.id.navigation_notifications:
                    return true;
            }
            return false;
        }
    };

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the main; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

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

    private void loadFragment(Fragment fragment) {
        // load fragment
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.rl, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

主页

public class HomePage extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.app_bar_main, container, false);

        RecyclerView mRecyclerView = view.findViewById(R.id.recycleView);

        GridLayoutManager mGridLayoutManager = new GridLayoutManager(getActivity(), 2);
        mRecyclerView.setLayoutManager(mGridLayoutManager);

        mRecyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

        List <Book> bookList= new ArrayList<>();
        Book book = new Book();
        book = new Book("Introduction to Java Programming", 15.00, "4.5", Uri.parse("android.resource://com.example.seng.sechandapp/drawable/book").toString());
        bookList.add(book);
        book = new Book("Java", 15.00, "4.5", Uri.parse("android.resource://com.example.seng.sechandapp/drawable/book").toString());
        bookList.add(book);
        HomePageAdapter homePageAdapter = new HomePageAdapter(getActivity(), bookList);
        mRecyclerView.setAdapter(homePageAdapter);
        return view;
    }
}

app_bar_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
        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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.seng.sechandapp.MainPage">

    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"
                  app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:orientation="vertical">

        <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="@color/blueviolet"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

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

        <include layout="@layout/home_page"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"/>

    </LinearLayout>


</android.support.design.widget.CoordinatorLayout>

主页

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:orientation="vertical" android:layout_width="match_parent"
             android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView android:layout_width="match_parent"
                                            android:layout_height="match_parent"
                                            android:id="@+id/recycleView">
    </android.support.v7.widget.RecyclerView>
</FrameLayout>

【问题讨论】:

  • 你在为HomePage 的布局膨胀app_bar_main,所以这是一个全新的Toolbar 覆盖在Activity 的顶部,这就是切换和标题消失的原因.您可能打算在那里膨胀home_page。另外,我不确定你想要什么作为启动时的主要内容,但 &lt;include&gt; 可能应该是一个空的 &lt;FrameLayout&gt;,它的 ID 是你将在 replace() 调用中传递的,而不是 @ 987654339@.

标签: android navigation-drawer bottomnavigationview


【解决方案1】:

试试这个

在您的代码中进行以下更改

第一次改变

在您的主页片段

中使用它
 View view = inflater.inflate(R.layout.home_page, container, false);

而不是

 View view = inflater.inflate(R.layout.app_bar_main, container, false);

第二次改变

现在在您的home_page 添加android:layout_marginTop="?actionBarSize" 在您的FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_marginTop="?actionBarSize"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycleView"
        android:layout_width="match_parent"


        android:layout_height="match_parent"/>
</FrameLayout>

其他一些建议

在您的 build.gradle 中使用 implementation 而不是 compile 因为

  • 配置 compile 已过时,已替换为 implementation。 将于 2018 年底移除

【讨论】:

  • 感谢您的建议。我的代码中不需要这一行 android:layout_marginTop="?actionBarSize" :)
【解决方案2】:

您在 Fragment 中膨胀 app_bar_main.xml 而不是 home_page.xml。将View view = inflater.inflate(R.layout.app_bar_main, container, false); 替换为View view = inflater.inflate(R.layout.home_page, container, false);。 ID R.id.rl 的视图在哪里?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多