宣傳軟文范例優(yōu)化快速排名教程
序言
在做項目的時候,有時候需要一個全局統(tǒng)一的標題欄,保證項目風(fēng)格的統(tǒng)一,但是如果在每個activity上面都寫一遍這個標題欄就很麻煩了,我們經(jīng)常用的方法就是寫個基類Activity,然后當某個Activity需要這個統(tǒng)一的標題欄的時候,繼承這個Activity就好了。
實現(xiàn)
1.實現(xiàn)我們需要的標題欄的視圖
例如:我們現(xiàn)在需要一個標題欄,左邊是Back按鈕,返回按鈕旁邊有文字提示,中間是文字顯示,右側(cè)是Home按鈕。
我們需要在xml文件中寫出這種布局(代碼略)
2.創(chuàng)建View加載布局
public class NavBarLayout extends LinearLayout {private ImageView backNav;private TextView backName;private TextView centerName;private ImageView homeNav;private INavClickListener listener;public NavBarLayout(Context context) {super(context);init(context);}public NavBarLayout(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public NavBarLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}public void setNavClickListener(INavClickListener iNavClickListener) {this.listener = iNavClickListener;}private void init(Context mContext) {LayoutInflater.from(mContext).inflate(R.layout.layout_top_nav_bar, this);backNav = findViewById(R.id.image_back);backName = findViewById(R.id.text_back);centerName = findViewById(R.id.ext_center);homeNav = findViewById(R.id.mage_home);//這是為了增大Back的返回按鈕點擊區(qū)域,將Back按鈕和Name區(qū)域放在一起LinearLayout llBack = findViewById(R.id.ll_back_tap);//默認實現(xiàn)listener = new INavClickListener() {@Overridepublic void backClick(Context context) {INavClickListener.super.backClick(context);}@Overridepublic void homeClick(Context context) {INavClickListener.super.homeClick(context);}};//點擊返回按鈕llBack.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {if (listener != null) {listener.backClick(mContext);}}});//點擊Home按鈕homeNav.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {if (listener != null) {listener.homeClick(mContext);}}});}/*** 設(shè)置返回按鈕圖片*/public NavBarLayout setNavBackImage(int res) {backNav.setImageResource(res);return this;}/*** 設(shè)置返回按鈕旁邊的文字*/public NavBarLayout setNavBackName(String text) {backName.setText(text);return this;}/*** 設(shè)置中間的文字*/public NavBarLayout setNavCenterText(String text) {centerName.setText(text);return this;}/*** 設(shè)置Home按鈕圖片*/public NavBarLayout setNavHomeImage(int res) {homeNav.setImageResource(res);return this;}/*** 設(shè)置中間文字是否顯示*/public NavBarLayout setNavCenterIsShow(boolean isShow) {if (isShow) {centerName.setVisibility(View.VISIBLE);} else {centerName.setVisibility(View.GONE);}return this;}/*** 設(shè)置Home圖案是否顯示*/public NavBarLayout setNavHomeIsShow(boolean isShow) {if (isShow) {homeNav.setVisibility(View.VISIBLE);} else {homeNav.setVisibility(View.GONE);}return this;}public interface INavClickListener {//默認實現(xiàn)點擊返回上一層default void backClick(Context context) {Activity activity = (Activity) context;activity.onBackPressed();};//默認實現(xiàn)跳轉(zhuǎn)到某個頁面(比如主頁面)default void homeClick(Context context) {//這里使用了DRouter框架實現(xiàn)頁面跳轉(zhuǎn)DRouter.build("/main").start(context);};}
}
這樣的話我們的View就實現(xiàn)了,接下來就是在基類里面使用。
3.基類使用
3.1創(chuàng)建基類的xml文件【layout_base】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ll_view_base"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#DBE5F1"android:orientation="vertical"><com.view.NavBarLayoutandroid:id="@+id/base_nav"android:layout_width="match_parent"android:layout_height="60dp"android:visibility="visible" /><FrameLayoutandroid:id="@+id/ll_child_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
這里我們使用一個上下布局的線性布局,上邊是我們的標題欄布局,下面我們使用了一個FrameLayout幀布局,強烈推薦使用這種布局,不容易產(chǎn)生各種莫名其妙的問題。我們以后使用這個FrameLayout加載我們的子類activity的布局。
3.2基類的Activity
public class BaseActivity extends AppCompatActivity {private NavBarLayout navBarLayout;@Overridepublic void setContentView(int layoutResID) {super.setContentView(R.layout.layout_base); // 設(shè)置整個布局為基礎(chǔ)布局Objects.requireNonNull(getSupportActionBar()).hide(); // 隱藏ActionBar/ToolbarFrameLayout parentView = findViewById(R.id.ll_child_view); // 獲取基礎(chǔ)布局中的父容器navBarLayout = findViewById(R.id.base_nav); // 獲取基礎(chǔ)布局中的導(dǎo)航欄View childView = LayoutInflater.from(this).inflate(layoutResID, parentView, false); // 根據(jù)傳入的布局資源ID,生成子視圖parentView.addView(childView); // 將子視圖添加到父容器中}@Overridepublic void setContentView(View childView) {super.setContentView(R.layout.layout_base);Objects.requireNonNull(getSupportActionBar()).hide();FrameLayout parentView = findViewById(R.id.ll_child_view);navBarLayout = findViewById(R.id.base_nav);parentView.addView(childView);}@Overridepublic void setContentView(View view, ViewGroup.LayoutParams params) {super.setContentView(R.layout.layout_base);Objects.requireNonNull(getSupportActionBar()).hide();FrameLayout parentView = findViewById(R.id.ll_child_view);navBarLayout = findViewById(R.id.base_nav);parentView.addView(view, params);}//是否展示我們的導(dǎo)航欄protected void showNavBar(boolean isShow) {if (isShow) {navBarLayout.setVisibility(View.VISIBLE);} else {navBarLayout.setVisibility(View.GONE);}}//給外界提供修改我們導(dǎo)航欄的方法protected NavBarLayout setNavBar() {return this.navBarLayout;}
}
這里面我們可以注意到,我們將這個【setContentView】實現(xiàn)了三次,這是非常有必要的,因為我們不知道將來我們到底使用哪一種方法將子Activity的視圖加載進來。
4.使用
我們創(chuàng)建一個activity,然后繼承這個基類的activity,這樣我們就可以使用了。通過我們的【setNavBar()】方法可以修改我們默認的一些顯示文字和進行我們默認設(shè)置的按鈕的點擊跳轉(zhuǎn)設(shè)置。