19.ToolBar實現隱藏,返回,搜索,三個點強制顯示


本文實現

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();
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM