本文实现
1.能实现ToolBar的显示和隐藏
2.实现可以在左上角添加返回按钮
3.能实现在导航栏显示按钮,并实现点击事件
4.能实现使用反射机制,强行将三个点显示
5.实现搜索文本框,两种事件,文本框变化事件,文本框确定搜索事件
需要注意的是,使用ToolBar的时候,需要在当前界面进行选择一个主题,
这个主题要求没有ActionBar,意思是现在的ToolBar是我们通过代码加上的
在res文件夹下values中找到style.xml下,添加主题风格
上面是一个有ActionBar的,因为在第一个界面就使用正常界面即可
下面这个是没有ActionBar的,我们需要自己对界面进行添加内容包括是不是有导航栏,导航栏长什么样,有什么功能
<resources> <!-- Base application theme. --> <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> </style> <!-- Base application theme. --> <style name="AppThemeNoActionBar" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
点击跳转按钮可以到第二个有ToolBar返回的界面,
1.返回功能,在ActionBar中返回功能和右边的功能不能同时使用。
这样就是不得不去学习ToolBar来代替ActionBar的原因了
在本程序中实现此功能只需要到MainFest下
android:parentActivityName=".MainActivity"
再去代码里加入
//显示左上角返回 ab.setDisplayHomeAsUpEnabled(true);
在MainFest中,注意是怎么进行设置主题的,在使用ToolBar的时候就将ActionBar不要了
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.xialm.toolbar2"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
//这是第二个界面,其中的主题用的是一个没有Action bar的一个主题,
//是在在res文件夹下values中找到style.xml下,进行的新建配置 <activity android:name=".Second" android:theme="@style/AppThemeNoActionBar" android:parentActivityName=".MainActivity" > </activity> </application> </manifest>
第一个界面就是一个跳转没有什么可写的
///////////////////////////////
第二个界面中,
我们一个一个的把功能拆开来讲
本界面在MainFest中进行设置主题没有ActionBar,所以说如果不进行任何操作的话,本界面没有导航栏。
ToolBar导航栏的出现,
首先要在xml中搞一个ToolBar出来
<?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" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical">
//显示的导航栏 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/AppTheme" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <Button android:id="@+id/button1" android:text="显示" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
设置完成之后,到java代码中
//注意导的是这个包 import android.support.v7.widget.Toolbar; //找到关心的控件 Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); //设置toolbar为当前的actionbar setSupportActionBar(toolbar); // Get a support ActionBar corresponding to this toolbar //获取与此工具栏对应的支持ActionBar android.support.v7.app.ActionBar ab = getSupportActionBar(); //隐藏和显示当前导航栏 ab.hide(); ab.show(); //判断有没有显示 ab.isShowing();
2.导航栏里的item添加
首先做一个文件,里面有很多item的文件,
res-->menu>新建item这样的xml文件,
如果没有menu文件夹,你需要新建一个,
AS中这样操作,你去百度,
新建好了文件之后,代码如下面这样
每一个item都是一个能够显示到标题栏能够进行点击事件的按钮
代码中有属性备注
<?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"> <item android:id="@+id/action_settings" android:orderInCategory="100"
app:showAsAction="never"//是不是显示在表面上还是显示在三个点里面, android:title="设置"//标题显示什么
/> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search"//显示的图标,这里调用的是系统资源里的图片 app:showAsAction="ifRoom|withText" //如果不够显示了再去显示到三个点里面 android:title="查询" /> <item android:id="@+id/action_add" android:icon="@android:drawable/ic_menu_add" app:showAsAction="ifRoom|withText" android:title="添加" /> <item android:id="@+id/action_ok" android:icon="@android:drawable/ic_menu_agenda" app:showAsAction="ifRoom|withText" android:title="okk" /> </menu>
新建完成之后还不能显示,我们要找到Java逻辑代码中的
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. //膨胀的菜单;如果操作栏存在,它将向操作栏添加项。 getMenuInflater().inflate(R.menu.main, menu); //上面的代码完成之后,那么就可以显示了, //下面的代码是一个查询的代码,也就是能够实现我们的那个搜索框功能 //添加点击查询的时候,有一个搜索框会显示 MenuItem itemm = menu.findItem(R.id.action_search); //实例化一个查询视图 SearchView mysSearchView = new SearchView(this); //设置用户输入的文本 SpannableString spantext = new SpannableString("请输入名字"); //设置成什么样子,起始下标,终止下标,标签 //第一个参数使用了前景色, spantext.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spantext.length() - 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //没有输入是什么显示 mysSearchView.setQueryHint("没有输入是什么显示"); //查询视图对象设置到菜单上来 itemm.setActionView(mysSearchView); //设置相应监听,查询文本监听 mysSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { //查询文本提交时触发的 @Override public boolean onQueryTextSubmit(String arg0) { //提交的时候触发 Toast.makeText(getApplicationContext(), arg0, Toast.LENGTH_SHORT).show(); // TODO Auto-generated method stub return false; } //输入文本发生变化的时候触发的方法 @Override public boolean onQueryTextChange(String arg0) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "你输入了" + arg0, Toast.LENGTH_SHORT).show(); return false; } }); return true; }
下一个我们给其他的Item设置上监听
@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(); switch (id) { case R.id.action_search: Toast.makeText(getApplicationContext(), "你点击了查询", Toast.LENGTH_SHORT).show(); break; case R.id.action_add: Toast.makeText(getApplicationContext(), "你点击了添加", Toast.LENGTH_SHORT).show(); break; case R.id.action_settings: Toast.makeText(getApplicationContext(), "你点击了设置", Toast.LENGTH_SHORT).show(); break; //实现的是左上角的返回键监听 //这个按钮的id不需要自己设置 case android.R.id.home: Toast.makeText(getApplicationContext(), "你点击了home", Toast.LENGTH_SHORT).show(); break; default: break; } // if (id == R.id.action_settings) { // return true; // } return super.onOptionsItemSelected(item); }
监听完毕,
我们知道当现市面上仍然存在着手机是有菜单键的,实体菜单键,这个键的功能和那右上角的三个点的功能是一样的
但是拥有实体菜单键的人们有的时候会忽略掉一些功能
于是人们就用一种叫做反射的手法,对程序自行判断有没有实体键进行操作
下面我们实现,无论有没有实体键都会显示三个点
//修改正在活动的实体menu键的返回类型,实现有没有实体键都能显示。 private void get_over_menu() { //截获实体menu属性, //并更改他 //先找到当前的配置属性 ViewConfiguration confi = ViewConfiguration.get(getApplicationContext()); //confi就是当前的配置属性了 //获得界面配置的?? try { Field myField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); //"sHasPermanentMenuKey"有没有实体键 if (myField!=null) { //修改访问属性,true是可以访问了 myField.setAccessible(true); myField.setBoolean(confi, false); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
本篇结束,下面是全部代码,
mainfest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.xialm.toolbar2"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Second" android:theme="@style/AppThemeNoActionBar" android:parentActivityName=".MainActivity" > </activity> </application> </manifest>
style中
<resources> <!-- Base application theme. --> <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> </style> <!-- Base application theme. --> <style name="AppThemeNoActionBar" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
menu中的
<?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"> <item android:id="@+id/action_settings" android:orderInCategory="100" app:showAsAction="never" android:title="设置"/> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" app:showAsAction="ifRoom|withText" android:title="查询" /> <item android:id="@+id/action_add" android:icon="@android:drawable/ic_menu_add" app:showAsAction="ifRoom|withText" android:title="添加" /> <item android:id="@+id/action_ok" android:icon="@android:drawable/ic_menu_agenda" app:showAsAction="ifRoom|withText" android:title="okk" /> </menu>
布局一
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.xialm.toolbar2.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textView" /> <Button android:id="@+id/bt_to" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳转" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout>
布局二
<?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" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/AppTheme" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <Button android:id="@+id/button1" android:text="显示" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
逻辑代码一:
package com.example.xialm.toolbar2; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b_1 = (Button)findViewById(R.id.bt_to); b_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,Second.class)); } }); } }
代码二
package com.example.xialm.toolbar2; import android.app.ActionBar; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; import android.widget.Button; import android.widget.SearchView; import android.widget.Toast; import java.lang.reflect.Field; /** * Created by xialm on 2019/10/30. */ public class Second extends MainActivity { private Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); //找到关心的控件 Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); b1 = (Button)findViewById(R.id.button1); //设置toolbar为当前的actionbar setSupportActionBar(toolbar); // Get a support ActionBar corresponding to this toolbar //获取与此工具栏对应的支持ActionBar android.support.v7.app.ActionBar ab = getSupportActionBar(); //按钮添加事件实现可以显示与隐藏导航栏 b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub android.support.v7.app.ActionBar ab = getSupportActionBar(); //实现导航栏的显示和隐藏 //判断当钱导航栏状态 if (ab.isShowing()) { ab.hide(); b1.setText("显示导航栏"); } else { ab.show(); b1.setText("隐藏导航栏"); } } }); //显示左上角返回 ab.setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); //添加点击查询的时候,有一个搜索框会显示 MenuItem itemm = menu.findItem(R.id.action_search); //实例化一个查询视图 SearchView mysSearchView = new SearchView(this); //设置用户输入的文本 SpannableString spantext = new SpannableString("请输入名字"); //设置成什么样子,起始下标,终止下标,标签 //第一个参数使用了前景色, spantext.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spantext.length() - 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //没有输入是什么显示 mysSearchView.setQueryHint("没有输入是什么显示"); //查询视图对象设置到菜单上来 itemm.setActionView(mysSearchView); //设置相应监听,查询文本监听 mysSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { //查询文本提交时触发的 @Override public boolean onQueryTextSubmit(String arg0) { //提交的时候触发 Toast.makeText(getApplicationContext(), arg0, Toast.LENGTH_SHORT).show(); // TODO Auto-generated method stub return false; } //输入文本发生变化的时候触发的方法 @Override public boolean onQueryTextChange(String arg0) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "你输入了" + arg0, Toast.LENGTH_SHORT).show(); return false; } }); return true; } //导航栏中菜单需要在res里面menu里面的xml的文件下,进行添加 //下面的逻辑实现点击事件 @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(); switch (id) { case R.id.action_search: Toast.makeText(getApplicationContext(), "你点击了查询", Toast.LENGTH_SHORT).show(); break; case R.id.action_add: Toast.makeText(getApplicationContext(), "你点击了添加", Toast.LENGTH_SHORT).show(); break; case R.id.action_settings: Toast.makeText(getApplicationContext(), "你点击了设置", Toast.LENGTH_SHORT).show(); break; //实现的是左上角的返回键监听 //这个按钮的id不需要自己设置 case android.R.id.home: Toast.makeText(getApplicationContext(), "你点击了home", Toast.LENGTH_SHORT).show(); break; default: break; } // if (id == R.id.action_settings) { // return true; // } return super.onOptionsItemSelected(item); } /* @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.item_many, menu); return super.onCreateOptionsMenu(menu); }*/ /* @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.ac_1: Toast.makeText(this, "跳转走", Toast.LENGTH_SHORT).show(); return true; case R.id.ac_2: Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }*/ //修改正在活动的实体menu键的返回类型,实现有没有实体键都能显示。 private void get_over_menu() { //截获实体menu属性, //并更改他 //先找到当前的配置属性 ViewConfiguration confi = ViewConfiguration.get(getApplicationContext()); //confi就是当前的配置属性了 //获得界面配置的?? try { Field myField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); //"sHasPermanentMenuKey"有没有实体键 if (myField!=null) { //修改访问属性,true是可以访问了 myField.setAccessible(true); myField.setBoolean(confi, false); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }