本文實現
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(); } } }