Android实现CSDNapp暗黑模式下的ActionBar—新手也能看懂
今天刚接触Android的ActionBar了解了其基本属性,下面做一下分享
显示和隐藏
添加Action Item
添加Action View
实战:
CSDN原图:
实现图:(轻喷,本人新手)
显示和隐藏
Android3.0(API 11)以上默认显示
1、在布局文件中设置
2、在Java代码中设置
(1)、获取ActionBar对象 通过 getSupporActionBar()
ActionBar bar=getSupporActionBar();
(2)、隐藏 bar.hide(); 显示 bar.show();
添加Action Item
步骤
1、定义菜单资源文件
在res节点下新建menu文件夹,之后新建menu.xml文件
<menu> <item > </menu> 使用<item>定义
app:showAsAction=\"\"里的属性表示该<item>在ActionBar中的显示方式
always始终显示在ActionBar上never显示在溢出菜单中ifRoom表示如果有空间就显示在ActionBar上,否则显示在溢出菜单中
2、重写 onCreateOptiosMenu(Menu menu )方法加载菜单资源文件让其添加到Action Bar或溢出菜单中
(1)、 获得MenuInflater lnflater =getMenuInflater(); //通过该对象调用lnflater()方法加载菜单资源文件
(2)、 lnflater.lnflater(); 第一个参数指定要解析的菜单文件 第二个参数直接写menu
添加Action View
与Action Item差不多,在Action Item步骤1的基础上加上如下属性
app:actionViewClass=“android.support.v7.widget.SearchView”
实战:
暗黑模式CSDNapp的ActionBar
<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/search\"android:title=\"搜索\"app:actionViewClass=\"android.widget.SearchView\"app:showAsAction=\"always\"/><itemandroid:id=\"@+id/item5\"android:title=\"扫一扫\"app:showAsAction=\"never\"android:icon=\"@mipmap/i2\"/><itemandroid:id=\"@+id/item1\"android:title=\"写Blink\"app:showAsAction=\"never\"android:icon=\"@mipmap/i3\"/><itemandroid:id=\"@+id/item2\"android:title=\"任务\"app:showAsAction=\"never\"android:icon=\"@mipmap/i4\"/><itemandroid:id=\"@+id/item3\"android:title=\"签到\"app:showAsAction=\"never\"android:icon=\"@mipmap/i5\"/><itemandroid:id=\"@+id/item4\"android:title=\"写博客\"app:showAsAction=\"never\"android:icon=\"@mipmap/i1\"/></menu>
MytabListener类 实现androidx.appcompat.app.ActionBar.TabListener接口
重写其里面的方法实现,对各Tab进行切换 ,具体请看代码
package com.example.test;import android.app.Activity;import androidx.fragment.app.Fragment;//该类实现各标签的切换public class MytabListener implements androidx.appcompat.app.ActionBar.TabListener {private final Activity activity; //用于指定要加载fragment的Activityprivate final Class aClass; //用于指定要加载fragment的类private Fragment fragment; //定义fragment对象 注意导入的包public MytabListener(Activity activity, Class aClass) { //构造方法this.activity = activity;this.aClass = aClass;}@Overridepublic void onTabSelected(androidx.appcompat.app.ActionBar.Tab tab, androidx.fragment.app.FragmentTransaction ft) { //选中时if(fragment==null){fragment=Fragment.instantiate(activity,aClass.getName()); // 创建fragment对象ft.add(android.R.id.content,fragment,null);}ft.attach(fragment); //通过attach()方法显示新页面}@Overridepublic void onTabUnselected(androidx.appcompat.app.ActionBar.Tab tab, androidx.fragment.app.FragmentTransaction ft) { //退出时if (fragment!=null){ft.detach(fragment); //删除旧业面}}@Overridepublic void onTabReselected(androidx.appcompat.app.ActionBar.Tab tab, androidx.fragment.app.FragmentTransaction ft) {}}
MainActivity类,主要实现加载菜单项、与实现监听等
package com.example.test;import android.app.ActionBar.TabListener;import androidx.annotation.NonNull;import androidx.appcompat.app.ActionBar;import androidx.appcompat.app.AppCompatActivity;import androidx.appcompat.view.menu.MenuBuilder;import android.annotation.SuppressLint;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.widget.SearchView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {@SuppressLint(\"RestrictedApi\")@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater lnflater =getMenuInflater(); ////获得,通过该对象调用lnflater()方法加载菜单资源文件lnflater.inflate(R.menu.menu,menu); //第一个参数指定要解析的菜单文件 第二个参数直接写menuif(menu instanceof MenuBuilder){MenuBuilder m = (MenuBuilder) menu;m.setOptionalIconsVisible(true); //noinspection RestrictedApi}MenuItem searchItem = menu.findItem(R.id.search);SearchView searchView = (SearchView)searchItem.getActionView();searchView.setQueryHint(\"搜索博文/帖子/用户\");searchView.setIconifiedByDefault(false);return super.onCreateOptionsMenu(menu);}//重写onOptionsItemSelected(@NonNull MenuItem item) 对菜单进行监听@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) { //对菜单进行监听switch (item.getItemId()) { //利用MenuItem item的getItemId()方法 获取点了那个idcase R.id.item1:{Toast.makeText(this,\"点击了写Blink\",Toast.LENGTH_LONG).show(); break;}case R.id.item2:{Toast.makeText(this,\"点击了任务\",Toast.LENGTH_LONG).show();break;}case R.id.item3:{Toast.makeText(this,\"点击了签到\",Toast.LENGTH_LONG).show();break;}case R.id.item4:{Toast.makeText(this,\"点击了写博客\",Toast.LENGTH_LONG).show();break;}case R.id.item5:{Toast.makeText(this,\"点击了扫一扫\",Toast.LENGTH_LONG).show();break;}}return super.onOptionsItemSelected(item);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar =getSupportActionBar(); //获得ActionBar对象actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //设置其为选项卡模式getSupportActionBar().setDisplayShowTitleEnabled(false);//添加Tab//可以选择跳到不同的fragment1,这里只做演示,均跳到同一个actionBar.addTab(actionBar.newTab().setText(\"关注\").setTabListener(new MytabListener(this,fragment1.class)));actionBar.addTab(actionBar.newTab().setText(\"推荐\").setTabListener(new MytabListener(this,fragment1.class)));actionBar.addTab(actionBar.newTab().setText(\"视频\").setTabListener(new MytabListener(this,fragment1.class)));actionBar.addTab(actionBar.newTab().setText(\"热榜\").setTabListener(new MytabListener(this,fragment1.class)));actionBar.addTab(actionBar.newTab().setText(\"精读\").setTabListener(new MytabListener(this,fragment1.class)));}}
fragment1类是点击Tab跳转的页面(不是本次内容,只做简单介绍)
package com.example.test;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;public class fragment1 extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view=inflater.inflate(R.layout.fragment_1,container,false);return view;}}