注意:
本文主要介紹安卓自定義頂部導航欄(iOS中成為NavigationBar);寫的不盡如人意的地方,請見諒~
概述如下:
- 環境 :Android Studio 1.4 for Mac
- 語言 :如果我沒猜錯的話,應該是Java
- 特點 :簡單、直接、暴力,絕對讓你有快感!!!
展示
1.效果展示
2.工程目錄結構
簡要說明
主要用到的文件已為大家用黃色的方框標出來了;
- Java類
MainActivity:還用解釋?
ShowNavigationActivity:展示自定義Navigation的類(iOS中可以理解為在ViewController中調用)
WJNavigationBarActivity:自定義Navigation
- 布局
activity_main:不解釋
activity_shownavigation.xml:ShowNavigationActivity.java綁定的頁面
activity_wjnavigationbar.xml:自定義Navigation布局頁面
- 資源(我覺得這么叫就是對的!!!)
navigationbar_left_item_selector.xml:NavigationItemLetfButton
navigationbar_right_item_selector.xml:NavigationItemRightButton
各種以.png結尾的就是圖片而已
1.開始寫布局
1.1 -- 主頁面
activity_main.xml
<LinearLayout
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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button
android:id="@+id/navigation_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="展示NavigationBar"
android:background="#aa0d3f"/>
</LinearLayout>
簡要說明
就是一個按鈕而已
1.2 -- 展示頁面
activity_shownavigation.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical">
<com.example.apple.complete_stretchlistview_for_wangjun.showCustomNavigationBar.WJNavigationBarActivity
android:id="@+id/navi_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"/>
</LinearLayout>
簡要說明
把自定義Navigation添加到你要使用的頁面中
1.3 -- Navigation布局頁面
activity_wjnavigationbar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_chat_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#91c2ae"
android:layout_alignParentTop="true">
<!-- navigationItemLeftButton -->
<ImageView
android:id="@+id/iv_navi_back"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="@drawable/navigationbar_left_item_selector"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<!-- navigationItemTitle -->
<TextView
android:id="@+id/tv_navi_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="自定義NavigationBar"
android:textSize="15dp"/>
<!-- navigationItemRightButton -->
<ImageView
android:id="@+id/iv_navi_right"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="@drawable/navigationbar_right_item_selector"
android:clickable="true"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"/>
</RelativeLayout>
簡要說明
這個頁面采用的是相對布局,我本人是很中意這種布局的,因為和Masonry很像
1.3 -- 資源
navigationbar_left_item_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/navi_btn_back_n"/>
<item android:state_pressed="true" android:drawable="@drawable/navi_btn_back_s"/>
</selector>
navigationbar_rigt_item_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/navi_btn_right_n"/>
<item android:state_pressed="true" android:drawable="@drawable/navi_btn_right_s"/>
</selector>
簡要說明
這個資源的xml主要作用是讓按鈕的icon有兩種效果,一個是默認效果,一個是選中效果;
在1.2頁面布局中有所引用,如下:
android:background="@drawable/navigationbar_left_item_selector"
android:background="@drawable/navigationbar_right_item_selector"
2.開始寫代碼
2.1 MainActivity.java
public class MainActivity extends AppCompatActivity
{
private Button navigation_btn; /// 展示自定義NavigationBar
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("做著玩的");
initView(); /// 初始化控件
selectorMethod(); /// 點擊事件
}
/*** * 初始化控件 */
public void initView()
{
navigation_btn = (Button) findViewById(R.id.navigation_btn);
}
/*** * 按鈕點擊事件 */
public void selectorMethod()
{
// 展示自定義NavigationBar
navigation_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("展示自定義NavigationBar");
// 跳轉頁面
Intent intent = new Intent(MainActivity.this, ShowNavigationActivity.class);
startActivity(intent);
}
});
}
}
2.2 ShowNavigationActivity.java
public class ShowNavigationActivity extends Activity
{
private WJNavigationBarActivity wjNavigationBarActivity; // 調用自定義Navigation的Java類
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shownavigation);
initView(); /// 初始化控件
}
/*** * 初始化 */
public void inieView()
{
wjNavigationBarActivity = (WJNavigationBarActivity) super.findViewById(R.id.navi_main);
wjNavigationBarActivity.setTitle("自定義導航欄");
// Java中叫回調,iOS中叫Block
wjNavigationBarActivity.setClickCallback(new WJNavigationBarActivity.ClickCallback() {
/*** * 返回按鈕 */
@Override
public void onBackClick() {
System.out.println("返回按鈕");
System.out.println("寫你的邏輯唄~");
}
/*** * 右側按鈕 */
@Override
public void onRightClick() {
System.out.println("右側按鈕");
System.out.println("寫你的邏輯唄~");
}
}
}
}
2.3 WJNavigationBarActivity.java
public class WJNavigationBarActivity extends RelativeLayout implements View.OnClickListener
{
private ImageView iv_navi_back; // 返回按鈕
private TextView tv_navi_title; // 中間的標題
private ImageView iv_navi_right; // 右邊的按鈕
public WJNavigationBarActivity(Context context)
{
this(context,null);
}
public WJNavigationBarActivity(Context context,AttributeSet attrs)
{
super(context,attrs);
View view = LayoutInflater.from(context).inflate(R.layout.activity_wjnavigationbar,this,true);
iv_navi_back = (ImageView) findViewById(R.id.iv_navi_back);
iv_navi_back.setOnClickListener(this);
tv_navi_title = (TextView) findViewById(R.id.tv_navi_title);
iv_navi_right = (ImageView) findViewById(R.id.iv_navi_right);
iv_navi_right.setOnClickListener(this);
}
/***
* 獲取返回按鈕
* @return iv_navi_back
*/
public ImageView getIv_navi_back()
{
return iv_navi_back;
}
/***
* 獲取標題
* @return tv_navi_title
*/
public TextView getTv_navi_title()
{
return tv_navi_title;
}
/***
* 設置標題
* @param title
*/
public void setTitle(String title)
{
tv_navi_title.setText(title);
}
/***
* 獲取右邊的按鈕
* @return iv_navi_right
*/
public ImageView getIv_navi_right()
{
return iv_navi_right;
}
private ClickCallback callback; // 聲明回調函數
/***
* 設置按鈕點擊回調的接口
* @param callback
*/
public void setClickCallback(ClickCallback callback)
{
this.callback = callback;
}
/***
* 導航欄點擊回調接口 -- Block中的回調方法
* 如若需要標題可點擊,可再添加
*/
public static interface ClickCallback
{
void onBackClick();
void onRightClick();
}
/***
* 點擊事件
*/
@Override
public void onClick(View v)
{
int id = v.getId();
if (id == R.id.iv_navi_back)
{
callback.onBackClick();
return;
}
if (id == R.id.iv_navi_right)
{
callback.onRightClick();
return;
}
}
}
簡要說明
這個類你可以理解為一個接口類,哪用哪調用唄,畢竟在安卓中我還是個小Baby(真TM無恥);
我在想,安卓肯定有一個和iOS一樣的全局設置Navigation的方法,只是我不知道,所以我是小baby~~
icon資源地址
鏈接:https://share.weiyun.com/1fe7867cfe261de78a6604c8a5dfe9fa (密碼:d3Cf9J)
總結
希望大家喜歡我寫的東西,轉發收藏什么的,多多益善~
后面有時間的話,我會在這篇文章中加上相對完整和人性化的東西.
如果我找到設置全局Navigation的方法,我就會添加
- wjNavigationBarActivity.show( )
- wjNavigationBarActivity.dismiss( )
最后,如果你有更好的,請回復我,并粘貼你的資料地址。
有事私信
WangJun 20161228