Matrial Design(五) toolbar(1)
来源:互联网 发布:linux 解压tar.gz 编辑:程序博客网 时间:2024/06/13 21:50
toolbar是android5.0推出的,如果minSDKVersion低于21,那么就需要再gradle里依赖v7包(v11包包含了v7包)。
只有继承之AppCompatActivity(实现了ActionBarDrawerToggle.DelegateProvider接口)的activity才能使用toolbar。该activity的主题也需要设置为NoActionBar(通常把application设置为NoActionBar),是为了方便用toolbar代替actionbar。
AndroidManifest.xml<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
style.xml<style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>
在activity中需要先调用setSupportActionBar()方法,然后就能调用toolbar的相关方法。通常我们会通过setTitle()方法设置标题(前提是先设置了getSupportActionBar().setDisplayShowTitleEnabled(false)),通过getSupportActionBar().setDisplayHomeAsUpEnabled(true)方法设置返回按钮,通过重写onCreateOptionsMenu()方法设置右侧的菜单以及通过inflateMenu()方法来增加菜单(此方法在整个页面第一次加载时并不管用)。还可以通过setNavigationIcon()方法设置左侧的按钮(返回按钮位置),通过setNavigationOnClickListener()方法对该按钮进行监听。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/tb_activity_main" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:theme="@style/AppTheme.AppBarOverlay"> </android.support.v7.widget.Toolbar> <android.support.v4.view.ViewPager android:id="@+id/vp_main" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager></LinearLayout> public class MainActivity extends AppCompatActivity { private Toolbar tbActivityMain; private ViewPager vpMain; private List<View> viewList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tbActivityMain = findViewById(R.id.tb_activity_main); vpMain = findViewById(R.id.vp_main); LayoutInflater inflater=getLayoutInflater(); View view1 = inflater.inflate(R.layout.pager1, null); View view2 = inflater.inflate(R.layout.pager2,null); // 将要分页显示的View装入数组中 viewList = new ArrayList<View>(); viewList.add(view1); viewList.add(view2); setSupportActionBar(tbActivityMain); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); tbActivityMain.setTitle("标题"); tbActivityMain.setNavigationIcon(R.mipmap.search); tbActivityMain.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); vpMain.setAdapter(new PagerAdapter() { @Override public int getCount() { return viewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(viewList.get(position)); return viewList.get(position); } }); vpMain.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position){ case 0: break; case 1: tbActivityMain.getMenu().clear(); tbActivityMain.inflateMenu(R.menu.menu_search2); break; } } @Override public void onPageScrollStateChanged(int state) { } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search1,menu); return super.onCreateOptionsMenu(menu); }}
上面代码效果图
toolbar本身是一个layout,所以我们可以在toolbar中绘制tablayout,或者搜索框一类的。如果在布局的toolbar根布局下放置控件,那么使用方法设置标题并不会显示。而且toolbar下可放置控件的范围并不是整个标题栏,而是排除了左侧按钮和右侧菜单的范围。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/tb_activity_main" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="#0f0" app:theme="@style/AppTheme.AppBarOverlay"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0ff"> </RelativeLayout> </android.support.v7.widget.Toolbar> <android.support.v4.view.ViewPager android:id="@+id/vp_main" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager></LinearLayout>
布局文件改成如上,效果变成如下:
这时如果需要设置标题,可以在toolbar里面放置一个textview作为标题。
除了在toolbar根布局下放置控件来丰富我们的标题栏,还可以自定义toolbar,MyToolBar继承ToolBar方法,然后在其构造方法中inflate一个布局。但是还是有一些问题,方法设置标题仍然不显示,仍然需要你在自定义类的布局文件中放置一个textview作为标题。还有一个更为严重的问题,toolbar左边按钮和右边的菜单图标莫名向上偏移了。
public class MyToolbar extends Toolbar { private LayoutInflater mInflater; private TextView mTvTabToolbarTitle; private View mView; public MyToolbar(Context context) { this(context, null); } public MyToolbar(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MyToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); if (attrs != null) { TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.MyToolbar, defStyleAttr, 0); String title = a.getString(R.styleable.MyToolbar_title); mTvTabToolbarTitle.setText(title); a.recycle(); } } private void initView() { if (mView == null) { mInflater = LayoutInflater.from(getContext()); mView = mInflater.inflate(R.layout.mytoolbar, null); mTvTabToolbarTitle = (TextView) mView.findViewById(R.id.tv_toolbar_title); LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL); addView(mView, lp); } } public void setTitle(String title){ mTvTabToolbarTitle.setText(title); }}
res/values/attrs.xml文件<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="MyToolbar"> <attr name="title" format="string"/> </declare-styleable></resources>
布局修改为<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.a1qu212.toolbarapplication.view.MyToolbar android:id="@+id/tb_activity_main" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="#0f0" app:title="mytoolbar的标题" app:theme="@style/AppTheme.AppBarOverlay"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0ff"> </RelativeLayout> </com.example.a1qu212.toolbarapplication.view.MyToolbar> <android.support.v4.view.ViewPager android:id="@+id/vp_main" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager></LinearLayout>
然后效果图就变成这样了- Matrial Design(五) toolbar(1)
- Matrial Design(一)
- Matrial Design(二)
- Matrial Design(三)
- Matrial Design(四)(有问题大家都看过来)
- Material Design学习之Toolbar的使用(1)
- android material design之Toolbar(一)
- Material Design 组件 (五)
- ToolBar的模样自己画(五)
- Materail Design 入门(四)——Toolbar的使用方法(1)
- toolBar实现app bar(material design 定义的)
- android material design之toolbar,ExitUntilCollapsed(七)
- 开发者头条(四):加入Design :TabLayout + Toolbar
- android开发 -- Android Toolbar 开发实践总结(Material Design)
- 一步一个脚印之学习Material Design第一篇(ToolBar)
- Android的UI优化--Material Design之ToolBar(2017.06)
- Material Design整理(三)——ToolBar
- Android Material Design Toolbar笔记1
- 格雷码---递归
- getElementById与getElementsByTagName的区别
- pycharm import cv2 : no module named cv2
- Xshell与Xftp连接虚拟机
- HDU
- Matrial Design(五) toolbar(1)
- hdu 5545 The Battle of Guandu 最短路径
- Servlet的生命周期
- 字典树Trie总结
- h5页面中虚化文本框默认内容,当输入文字后默认内容消失怎么做?
- hdoj 6050(2017 Multi-University Training Contest
- Spring_泛型依赖注入
- 74. Search a 2D Matrix
- hiredis windows x64编译记录