Android实现CSDNapp暗黑模式下的ActionBar—新手也能看懂(2020-6-22)
2020-07-16 05:59
1056 查看
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" /> <item android:id="@+id/item5" android:title="扫一扫" app:showAsAction="never" android:icon="@mipmap/i2" /> <item android:id="@+id/item1" android:title="写Blink" app:showAsAction="never" android:icon="@mipmap/i3" /> <item android:id="@+id/item2" android:title="任务" app:showAsAction="never" android:icon="@mipmap/i4" /> <item android:id="@+id/item3" android:title="签到" app:showAsAction="never" android:icon="@mipmap/i5" /> <item android: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的Activity private final Class aClass; //用于指定要加载fragment的类 private Fragment fragment; //定义fragment对象 注意导入的包 public MytabListener(Activity activity, Class aClass) { //构造方法 this.activity = activity; this.aClass = aClass; } @Override public 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()方法显示新页面 } @Override public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab tab, androidx.fragment.app.FragmentTransaction ft) { //退出时 if (fragment!=null){ ft.detach(fragment); //删除旧业面 } } @Override public 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") @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater lnflater =getMenuInflater(); ////获得,通过该对象调用lnflater()方法加载菜单资源文件 lnflater.inflate(R.menu.menu,menu); //第一个参数指定要解析的菜单文件 第二个参数直接写menu if(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) 对菜单进行监听 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //对菜单进行监听 switch (item.getItemId()) { //利用MenuItem item的getItemId()方法 获取点了那个id case 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); } @Override protected 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 @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment_1,container,false); return view; } }
相关文章推荐
- Android入门之ActionBar实现Tab导航
- 调用getActionBar()总会报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar
- Android笔记之Fragment+ActionBar实现可滑可按选项卡
- Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- The First Android App----Adding the Action Bar
- 【Android界面实现】Styling the Action Bar
- Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
- android实现App新手引导功能
- Android学习-使用单例模式实现一键退出APP
- 【Android开发日记】使用 NavigationDrawer + fragment 实现sherlockActionBar+slidingmenu 功能
- Add ActionBar to Android 2.x (v7 appcompat library)
- 【Android UI设计与开发】第11期:顶部标题栏(二)ActionBar实现Tab选项卡和下拉导航列表
- java.lang.ClassCastException: android.app.ActionBar$LayoutParams cannot be cast to android.widget.Ab
- 一个android文本比对APP的实现(三)-设计模式在文件选择模块中的运用
- 【转】调用getActionBar()报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar
- Attempt to invoke virtual method 'void android.app.ActionBar.hide()' on a null object reference
- Android中给App设置NoActionBar/FullScreen
- Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
- android学习日记:actionbar中按钮的下拉菜单实现