首页 > 其他分享 >安卓-toolbar

安卓-toolbar

时间:2023-02-01 00:24:45浏览次数:44  
标签:mToolbar menu 安卓 item action public toolbar

一、ToolBar的风格

1、可以先定义toolbar的风格,并做成独立的资源文件作为公共的页面在每个需要显示相同toolbar的页面的xml中加入类似:<include layout="@layout/toolbar" />

这里定义一个简单的toolbar.xml文件

<?xml version="1.0" encoding="utf-8"?>

<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/AppTheme"
    >
</androidx.appcompat.widget.Toolbar>
View Code

2、在toolbar中增加返回图标、主标题和副标题

        mToolbar.setTitle("主标题");
        mToolbar.setSubtitle("副标题");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 在左上角增加一个返回的图标

通过上述1和2的操作,则可以在界面中显示简单的toolbar了

注意:该类继承的是AppCompatActivity

// AppCompatActivity代替了ActionBarActivity
public class ToolbarTest extends AppCompatActivity {
.......
}

 

 

二、在toolbar中加入菜单

这里定义一个简单的menu_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu 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"
    >
    <item
        android:id="@+id/ab_search"
        android:title="action_search"
        android:orderInCategory="80"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_share"
        android:title="action_share"
        android:orderInCategory="90"
        app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_setting"
        android:title="action_setting"
        android:orderInCategory="100"
        app:showAsAction="never" />
</menu>
View Code

包含了三个item:ab_search、action_share、action_setting

其中搜索的item:app:actionViewClass="androidx.appcompat.widget.SearchView" 则会显示为搜索的图标状态

共享的item:app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" 则会显示共享的图标状态

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu); // 

        return super.onCreateOptionsMenu(menu);
    }

如上则是将menu_main的资源inflate到menu中

在这里,我们可以对每个item进行自己想要的操作,比如share的操作

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.action_share));
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/*");
        shareActionProvider.setShareIntent(intent);

        return super.onCreateOptionsMenu(menu);
    }

如上则是将share过滤出包含text/的所有功能,点击share即会列出所有的这些功能

 

当想监听这几个item的点击事件,有两种方式

第一种:通过mToolbar.setOnMenuItemClickListener()的方式

        mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_setting:
                        Toast.makeText(ToolbarTest.this, "action_setting", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }

                return true;
            }
        });

但是点击的时候发现没有走进到这个itemclick函数,发现是因为改mToolbar对应的action没有attach本context;

可以通过setSupportActionBar(mToolbar); 进行操作,之后再mToolbar.setOnMenuItemClickListener()

但是在进行setSupportActionBar的时候竟然崩溃了,提示如下的错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.agiledeveloper.newfeatures/com.agiledeveloper.newfeatures.ToolbarTest}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

说是这个Activity已经有一个actionbar了,是window decor提供的

解决这个崩溃的方法是在AndroidManifest.xml中,修改android:theme 为另外的一个theme

以这里为例,这里目前默认的是:android:theme="@style/Theme.NewFeatures"    , 这边把它改成android:theme="@style/AppTheme" 崩溃即可解决,并且监听也能够监听的到

 

第二种监听item的点击事件

在onCreateOptionsMenu函数中增加对应的item的点击监听事件,这里以action_setting这个item为例

        MenuItem actionMenuItem = menu.findItem(R.id.action_setting);
        actionMenuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(ToolbarTest.this, "action_setting", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

如上所示:也可以实现改actionMenuItem的点击事件

 

三、在toolbar中增加侧滑菜单

如下是完整的toolbar_test.xml的配置

<?xml version="1.0" encoding="utf-8"?>
<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" />

    <!--如下是侧滑菜单,使用抽屉显示的方式; drawer_view页面需要设置layout_gravity,这里设置为start-->
    <!--也可以设置为end或者left或者right;这边咱们看到的start跟left的效果是一样的,但是一些阿拉伯国家他们的start就显示在右边,跟left产生的效果就不一样-->
    <androidx.drawerlayout.widget.DrawerLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/drawer">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/holo_blue_light"
            android:orientation="vertical">
            <Button
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:text="内容界面"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/drawer_view"
            android:layout_gravity="start"
            android:orientation="vertical">

            <Button
                android:layout_width="200dp"
                android:layout_height="match_parent"
                android:text="菜单界面" />
        </LinearLayout>

    </androidx.drawerlayout.widget.DrawerLayout>

</LinearLayout>
View Code

同时在oncreate中增加如下的代码

        DrawerLayout drawerLayout = findViewById(R.id.drawer);
        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mToolbar, R.string.app_name, R.string.hello_world);
        drawerToggle.syncState(); // 用来显示返回三个横杠,之后是一个箭头的返回
        drawerLayout.addDrawerListener(drawerToggle); // 建立DrawerLayout和ActionBarDrawerToggle的关联

如果要在菜单栏打开或关闭的时候增加监听,可以如下操作

        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mToolbar, R.string.app_name, R.string.hello_world) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }
        };

 

标签:mToolbar,menu,安卓,item,action,public,toolbar
From: https://www.cnblogs.com/czwlinux/p/17081214.html

相关文章