安卓-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 {
.......
}

 3、setDisplayHomeAsUpEnabled(true)添加后退按钮之后,点击后退按钮没有相应

查找原因发现后发现是因为在AndroidManifest.xml中,该activity没有指定对应的父activity: 如:ToolbarTest:<activity android:name=".ToolbarTest" android:parentActivityName=".MainActivity" />

如果不在activity中设置父亲activity,也可以在代码中增加如下:

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

 

 

二、在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);
            }
        };

 

posted @   LCAC  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示