Android实战(橘子娱乐)-首页(第二篇 首页布局与Activity代码)

版权声明:欢迎分享,但请注明出处,谢谢 https://blog.csdn.net/qq_28057577/article/details/78226084
前言:

    在  Android实战(橘子娱乐)-首页(第一篇 MVP框架基本搭建和实现准备) 中,我们实现了首页实现的准备以及MVP框架的基本搭建,也提到这篇我们将对首页的布局和activiy代码进行讲解,接下来我们完成这部分的学习。

依然是一张gif图直观些:

ok,讲布局xml之前我们先来设置一下Activity的Theme,下面是Theme代码(styles.xml):
    
    
  1. <resources xmlns:tools="http://schemas.android.com/tools">
  2. <!-- Base application theme. -->
  3. <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  4. <!-- Customize your theme here. -->
  5. <item name="colorPrimary">@color/colorPrimary</item>
  6. <item name="colorPrimaryDark">@color/colorPrimary</item>
  7. <item name="colorAccent">@color/colorPrimary</item>
  8. <item name="android:windowBackground">@color/background_material_light_new</item>
  9. <item name="android:windowAnimationStyle">@style/AnimationActivity</item>
  10. <!-- ActionBar上Menu的字体颜色 -->
  11. <item name="actionMenuTextColor">@color/white</item>
  12. <item name="android:actionOverflowMenuStyle" tools:targetApi="lollipop">@style/OverflowMenu</item>
  13. <!--按钮的颜色-->
  14. <item name="drawerArrowStyle">@style/AppTheme.DrawerArrowToggle</item>
  15. </style>
  16. <style name="AppTheme.DrawerArrowToggle" parent="Base.Widget.AppCompat.DrawerArrowToggle">
  17. <item name="color">@android:color/white</item>
  18. </style>
  1. <style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
  2. <item name="overlapAnchor">false</item>
  3. <item name="android:color">@color/white</item>
  4. </style>
  5. <!--Activity动画-->
  6. <style name="AnimationActivity" parent="@android:style/Animation.Activity">
  7. <!--打开新activity的进入效果-->
  8. <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
  9. <!--打开新activity销毁前的效果-->
  10. <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
  11. <!--关闭当前activity,进入上一activity的效果-->
  12. <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
  13. <!--当前activity关闭的效果-->
  14. <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
  15. </style>
  16. </resources>
        这么多style其实我重点想说一下  android:windowAnimationStyle 也就是设置Activity进入退出切换的动画效果,上面注释很清楚
    
    
  1. <!--打开新activity的进入效果-->
  2. <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
  3. <!--打开新activity销毁前的效果-->
  4. <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
  5. <!--关闭当前activity,进入上一activity的效果-->
  6. <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
  7. <!--当前activity关闭的效果-->
  8. <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
    那我们具体来看一下每个动画效果应该是怎样写的; 首先在res下面建anim文件夹保存动画文件,再来看具体文件:
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration="300"
  5. android:fromXDelta="0"
  6. android:toXDelta="100%"
  7. />
  8. <!--
  9. //间隔时间 单位为毫秒
  10. android:duration="300"
  11. //起始时x坐标的位置,其他类推
  12. android:fromXDelta="0"
  13. //加P表示一父view为参照物
  14. android:toXDelta="100%p"
  15. -->
  16. </set>
    注释一看便懂,也就不赘述了,如果不是很明白可以修改着跑起来看他们的效果就明白了。其实除了这种在styles.xml文件夹中添加style添加activity过渡效果以外,Google其实还提供了一种叫 ActvityOptions的一种方式添加过渡效果,想了解的伙伴可以去搜一下,这里就不展开了。

    style文件定义好我们需要用,这时候直接在AndroidManifest.xml的application标签下设置 Android:theme="@style/AppTheme"应用于全局即可,当然你可以设置单个Activity。
style设置好接下来我们来看首页布局文件(actvity_main.xml):

      
      
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:id="@+id/drawer_layout"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. >
  9. <!--主布局-->
  10. <!--
  11. CoordinatorLayout是一个super FrameLayout他提供了不需要写动画效果就能实现滚动效果的一种能力
  12. 比如:让浮动按钮上下滑动显示Snackbar,扩展或者缩小toolbar头部,控制某个view收缩扩展。
  13. -->
  14. <android.support.design.widget.CoordinatorLayout
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:layout_above="@+id/rg_root">
  18. <!--
  19. AppBarLayout是继承自LinearLayout实现的一个ViewGroup容器组件,作用是支持了
  20. APP Bar的手势滑动操作
  21. -->
  22. <android.support.design.widget.AppBarLayout
  23. style="@style/Theme.AppCompat.Light"
  24. android:layout_width="match_parent"
  25. android:layout_height="wrap_content"
  26. app:elevation="0dp">
  27. <!--顶部导航栏
  28. layout_scrollFlags监听IRecyclerView的滚动事件
  29. 必须至少启用scroll ,enterAlways表示一旦滚动这个view就可见
  30. app:popupTheme:设置有上角弹出菜单的样式
  31. -->
  32. <android.support.v7.widget.Toolbar
  33. android:id="@+id/toolbar"
  34. android:layout_width="match_parent"
  35. android:layout_height="?attr/actionBarSize"
  36. android:background="@color/colorPrimary"
  37. app:layout_scrollFlags="scroll|enterAlways"
  38. app:titleTextAppearance="@style/Toolbar.TitleText"
  39. app:popupTheme="@style/AppTheme.PopupOverlay">
  40. <RelativeLayout
  41. android:padding="5dp"
  42. android:layout_width="wrap_content"
  43. android:layout_height="wrap_content">
  44. <TextView
  45. android:text="首页"
  46. android:textSize="16sp"
  47. android:textColor="@color/white"
  48. android:layout_width="wrap_content"
  49. android:layout_centerVertical="true"
  50. android:layout_height="wrap_content"
  51. android:layout_alignParentLeft="true"
  52. />
  53. <ImageView
  54. android:id="@+id/btn_message"
  55. android:layout_alignParentRight="true"
  56. android:layout_centerVertical="true"
  57. android:layout_marginRight="10dp"
  58. android:clickable="true"
  59. android:src="@drawable/home_message"
  60. android:layout_width="wrap_content"
  61. android:layout_height="match_parent" />
  62. </RelativeLayout>
  63. </android.support.v7.widget.Toolbar>
  64. </android.support.design.widget.AppBarLayout>
  65. <com.aspsine.irecyclerview.IRecyclerView
  66. android:id="@+id/rv_content"
  67. android:layout_width="match_parent"
  68. android:layout_height="match_parent"
  69. app:refreshHeaderLayout="@layout/irecyclerview_refresh_header"
  70. app:refreshEnabled="true"
  71. app:layout_behavior="@string/appbar_scrolling_view_behavior">
  72. </com.aspsine.irecyclerview.IRecyclerView>
  73. </android.support.design.widget.CoordinatorLayout>
  74. <!--侧滑菜单配置
  75. app:headerLayout:配置侧滑抽屉顶部布局
  76. app:menu:配置底部菜单
  77. -->
  78. <android.support.design.widget.NavigationView
  79. android:id="@+id/navigation"
  80. android:layout_width="wrap_content"
  81. android:layout_height="match_parent"
  82. android:layout_gravity="start"
  83. android:background="@color/white"
  84. app:headerLayout="@layout/drawer_head_view"
  85. app:menu="@menu/drawer_menu"/>
  86. </android.support.v4.widget.DrawerLayout>
  
      分析:DrawerLayout和Navigation这里就不讲了,这里主要分析一下,在RecyclerView上滑的过程中,Toolbar更随滚动隐藏和展示的效果实现。要支持Toolbar 隐藏和展示 的效果需要 将内容保存到CoordinatorLayout 这个FrameLayout中,然后需要Toolbar和RecyclerView绑定起来,这样在RecyclerView滑动的时候才会触发Toolbar的显示与隐藏。所以上面在Toolbar中设置了 a pp:layout_scrollFlags = "scroll|enterAlways" ,在IRecyclerView上设置了   app:layout_behavior = "@string/appbar_scrolling_view_behavior" 就是这个意图。 app:layout_behavior = "@string/appbar_scrolling_view_behavior" 是固定不变的,我们来分析一下 a pp:layout_scrollFlags = "scroll|enterAlways"  的值和区别:

scroll 更随滚动事件滚出和滚进
scroll|enterAlways 和上面的优先级不同,上面是先滚动scrolling view 再滚动当前设置的view也就是toolbar,这里刚好相反
scroll|enterAlways|enterAlwaysCollapsed 在Toolbar滚动到最小高度时滚动Scrolling view,Scrolling view滚动完成时,在滚动appbar中剩余的高度  所以这里需要设置
android:minHeight=""
scroll|exitUntilCollapsed 实现在scrolling view上滑的过程中,view只滑动隐藏到最小高度值,然后不在隐藏,也就是不会完全退出屏幕
scroll|snap 滚动吸附效果,就是在scrolling view 滚动时更随滚动,松手后view更具临界点决定全部滚进屏幕显示,还是全部滚出屏幕隐藏
    toolbar跟随滚动完成后,我们来看看 com.aspsine.irecyclerview.IRecyclerView 这个开源项目的配置,其中中有两个配置需要说明一下:
    
    
  1. app:refreshHeaderLayout="@layout/irecyclerview_refresh_header"
  2. app:refreshEnabled="true"
一个是设置支持刷新,另外一个是设置刷新头部布局的,看上面gif下拉刷新的时候有几种状态:1.刷新前显示释放刷新  2.刷新中显示正在刷新 3.刷新完成后显示刷新完成。我们来看看他具体是什么
(irecyclerview_refresh_header.xml)
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.andy.orange.widget.ClassicRefreshHeaderView
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="60dp">
  6. </com.andy.orange.widget.ClassicRefreshHeaderView>
一个自定义的刷新头,这节我们先不讲,放到第三篇来完成。接下来我们来看看主页面Java类的逻辑代码:
MainActivity.java
     
     
  1. package com.andy.orange.ui;
  2. import android.content.Intent;
  3. import android.support.annotation.NonNull;
  4. import android.support.design.widget.NavigationView;
  5. import android.support.v4.view.GravityCompat;
  6. import android.support.v4.widget.DrawerLayout;
  7. import android.support.v7.app.ActionBar;
  8. import android.support.v7.app.ActionBarDrawerToggle;
  9. import android.support.v7.widget.GridLayoutManager;
  10. import android.support.v7.widget.Toolbar;
  11. import android.util.Log;
  12. import android.view.Menu;
  13. import android.view.MenuItem;
  14. import android.view.View;
  15. import android.widget.ImageView;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18. import com.andy.orange.R;
  19. import com.andy.orange.adapter.MainRecyclerViewAdapter;
  20. import com.andy.orange.anims.LandingAnimator;
  21. import com.andy.orange.anims.ScaleInAnimationAdapter;
  22. import com.andy.orange.base.BaseActivity;
  23. import com.andy.orange.bean.Film;
  24. import com.andy.orange.ui.coder.CoderActivity;
  25. import com.andy.orange.ui.home.presenter.impl.MainPresenterImpl;
  26. import com.andy.orange.ui.home.view.MainView;
  27. import com.andy.orange.ui.movie.MovieDetailActivity;
  28. import com.andy.orange.ui.movie.MovieDisplayActivity;
  29. import com.andy.orange.ui.music.MusicActivity;
  30. import com.andy.orange.utils.SharedPreferencesUtils;
  31. import com.aspsine.irecyclerview.IRecyclerView;
  32. import com.aspsine.irecyclerview.OnRefreshListener;
  33. import java.util.ArrayList;
  34. import java.util.List;
  35. import java.util.Random;
  36. import butterknife.BindView;
  37. /**
  38. * Created by Andy Lau on 2017/8/8.
  39. */
  40. public class MainActivity extends BaseActivity implements MainView,
  41. NavigationView.OnNavigationItemSelectedListener,OnRefreshListener,View.OnClickListener{
  42. private int count=24;
  43. private int start=0;
  44. private int randomStart= new Random().nextInt(300);
  45. @BindView(R.id.toolbar)
  46. Toolbar mToolbar;
  47. @BindView(R.id.navigation)
  48. NavigationView mNavigation;
  49. @BindView(R.id.drawer_layout)
  50. DrawerLayout mDrawerLayout;
  51. @BindView(R.id.rv_content)
  52. IRecyclerView mIRecyclerView;
  53. @BindView(R.id.btn_message)
  54. ImageView mMsgBtn;
  55. private ImageView IvHeadImg;
  56. private TextView loginTv;
  57. private MainRecyclerViewAdapter mMainAdapter;
  58. private List<Film.SubjectsBean> mList = new ArrayList<>();
  59. private MainPresenterImpl mainPresenter;
  60. /*
  61. * 侧滑导航的选中监听
  62. * */
  63. @Override
  64. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  65. //侧滑导航选中事件监听
  66. int itemId=item.getItemId();
  67. switch (itemId){
  68. case R.id.menu_home:
  69. break;
  70. case R.id.menu_live:
  71. //启动直播页面
  72. Intent liveIntent=new Intent(MainActivity.this,LiveActivity.class);
  73. startActivity(liveIntent);
  74. break;
  75. case R.id.menu_duanzi:
  76. //启动搞笑段子页面
  77. Intent duanIntent=new Intent(MainActivity.this,DuanziActivity.class);
  78. startActivity(duanIntent);
  79. break;
  80. case R.id.menu_book:
  81. //启动搞笑段子页面
  82. Intent bookIntent=new Intent(MainActivity.this,BookActivity.class);
  83. startActivity(bookIntent);
  84. break;
  85. case R.id.menu_movie:
  86. //启动电影页面
  87. Intent intent = new Intent(MainActivity.this, MovieDisplayActivity.class);
  88. startActivity(intent);
  89. break;
  90. case R.id.menu_music:
  91. //启动音乐页面
  92. Intent intent1=new Intent(MainActivity.this, MusicActivity.class);
  93. startActivity(intent1);
  94. break;
  95. case R.id.menu_info:
  96. //启动作者信息页
  97. Intent coderIntent=new Intent(MainActivity.this, CoderActivity.class);
  98. startActivity(coderIntent);
  99. break;
  100. case R.id.menu_about:
  101. //启动开源信息
  102. break;
  103. case R.id.menu_logout:
  104. //退出
  105. SharedPreferencesUtils.setSharedData(this,"is_login",false,"boolean");
  106. Intent restart=new Intent(MainActivity.this, MainActivity.class);
  107. startActivity(restart);
  108. break;
  109. }
  110. //关闭drawer
  111. item.setChecked(true);
  112. mDrawerLayout.closeDrawer(GravityCompat.START);
  113. return true;
  114. }
  115. /*
  116. * 继承自封装的BaseActivity
  117. * */
  118. @Override
  119. public int getChildLayoutId() {
  120. return R.layout.activity_main;
  121. }
  122. @Override
  123. public void initPresenter() {
  124. mainPresenter=new MainPresenterImpl(this, this);
  125. }
  126. @Override
  127. public void initView() {
  128. mContext=this;
  129. setToolbar();
  130. setNavigationView();
  131. initData();
  132. mainPresenter.requestHotFilm(randomStart,count);
  133. randomStart=randomStart+count;
  134. }
  135. /*
  136. * 设置toolbar和与drawerLayout绑定
  137. * */
  138. private void setToolbar() {
  139. setSupportActionBar(mToolbar);
  140. ActionBar actionBar=getSupportActionBar();
  141. //菜单按钮可用
  142. actionBar.setHomeButtonEnabled(true);
  143. //回退按钮可用
  144. //actionBar.setDisplayHomeAsUpEnabled(true);
  145. //将drawerLayout和toolbar绑定在一起
  146. ActionBarDrawerToggle toggle=new ActionBarDrawerToggle(this,mDrawerLayout,mToolbar,R.string.app_name,R.string.app_name);
  147. //初始化状态
  148. toggle.syncState();
  149. //设置drawerLayout的监听事件 打开/关闭
  150. mDrawerLayout.addDrawerListener(toggle);
  151. //去除侧滑菜单的遮罩层
  152. //mDrawerLayout.setScrimColor(Color.TRANSPARENT);
  153. //初始化内容
  154. // mToolbar.setTitleTextColor(getResources().getColor(R.color.black));
  155. //设置右上角消息图标监听事件
  156. mMsgBtn.setOnClickListener(this);
  157. }
  158. /*
  159. * 设置导航菜单
  160. * */
  161. private void setNavigationView() {
  162. //设置图标显示他自己的颜色
  163. mNavigation.setItemIconTintList(null);
  164. //获取到侧滑菜单顶部
  165. View headerView=mNavigation.getHeaderView(0);
  166. //获取绑定头像和登录提示文本
  167. IvHeadImg= (ImageView) headerView.findViewById(R.id.header_icon);
  168. loginTv= (TextView) headerView.findViewById(R.id.nick_name);
  169. //设置导航监听
  170. mNavigation.setNavigationItemSelectedListener(this);
  171. setHomeDefaultState();
  172. //初始化登录状态
  173. initLoginState();
  174. }
  175. /**
  176. * 设置首页默认被选中的状态
  177. */
  178. private void setHomeDefaultState(){
  179. Menu menu=mNavigation.getMenu();
  180. MenuItem item=menu.getItem(0).getSubMenu().getItem(0);
  181. item.setChecked(true);
  182. }
  183. /*
  184. * 初始化登录状态
  185. * */
  186. private void initLoginState() {
  187. //获取sharedPreference的登录状态
  188. Boolean isLogin=false;
  189. isLogin= (Boolean) SharedPreferencesUtils.readSharedData(mContext,"is_login","boolean");
  190. if (null !=isLogin && isLogin){
  191. //获取上次登录时间
  192. long date= (long) SharedPreferencesUtils.readSharedData(this,"login_date","long");
  193. //大于一周设置设置登录状态为false
  194. if (System.currentTimeMillis()-date>7*24*3600*1000){
  195. SharedPreferencesUtils.setSharedData(this,"is_login",false,"boolean");
  196. isLogin=false;
  197. }
  198. }
  199. if (null !=isLogin && isLogin){
  200. IvHeadImg.setImageResource(R.mipmap.head_image);
  201. String username= (String) SharedPreferencesUtils.readSharedData(mContext,"nick_name","string");
  202. loginTv.setText(username);
  203. }else {
  204. //Toast.makeText(mContext,"未等录 " ,Toast.LENGTH_SHORT).show();
  205. loginTv.setText("点击登录");
  206. IvHeadImg.setOnClickListener(new View.OnClickListener() {
  207. @Override
  208. public void onClick(View v) {
  209. //启动登录界面
  210. Intent intent=new Intent(MainActivity.this,LoginActivity.class);
  211. startActivity(intent);
  212. //Toast.makeText(MainActivity.this,"login",Toast.LENGTH_SHORT).show();
  213. }
  214. });
  215. }
  216. }
  217. /*
  218. * 初始化数据
  219. * */
  220. private void initData() {
  221. //初始化适配器
  222. mMainAdapter = new MainRecyclerViewAdapter(mContext, mList);
  223. //设置布局
  224. GridLayoutManager manager=new GridLayoutManager(mContext,2,GridLayoutManager.VERTICAL,false);
  225. //设置item跨度
  226. manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
  227. @Override
  228. public int getSpanSize(int position) {
  229. if (position==0||position==1||position==mList.size()+2){
  230. return 2;
  231. }
  232. return 1;
  233. }
  234. });
  235. //绑定布局管理器和刷新监听器
  236. mIRecyclerView.setLayoutManager(manager);
  237. mIRecyclerView.setOnRefreshListener(this);
  238. //MainRecyclerViewAdapter开放setOnItemClickListener()方法
  239. mMainAdapter.setOnItemClickListener(new MainRecyclerViewAdapter.onItemClickListener() {
  240. @Override
  241. public void onItemClick(int position, ImageView imageView) {
  242. //启动电影细节页
  243. Intent intent=new Intent(MainActivity.this, MovieDetailActivity.class);
  244. intent.putExtra("movieId",mList.get(position).getId());
  245. startActivity(intent);
  246. }
  247. });
  248. //设置recyclerview动画
  249. mIRecyclerView.setItemAnimator(new LandingAnimator());
  250. //设置适配器
  251. mIRecyclerView.setIAdapter(new ScaleInAnimationAdapter(mMainAdapter));
  252. }
  253. @Override
  254. public void onRefresh() {
  255. mIRecyclerView.setRefreshing(true);
  256. mainPresenter.requestHotFilm(randomStart,count);
  257. randomStart=randomStart+count;
  258. }
  259. /*
  260. * 继承自MainRecyclerViewAdapter.OnItemClickListener接口的方法
  261. * */
  262. @Override
  263. public void getFilmInfos(Film film) {
  264. mIRecyclerView.setRefreshing(false);
  265. for (int i=0;i<film.getSubjects().size();i++) {
  266. mList.add(film.getSubjects().get(i));
  267. }
  268. mMainAdapter.notifyDataSetChanged();
  269. }
  270. @Override
  271. public void onClick(View v) {
  272. switch (v.getId()){
  273. case R.id.btn_message:
  274. Toast.makeText(mContext,"查看推送消息!",Toast.LENGTH_LONG).show();
  275. Log.d("log","查看推送消息");
  276. break;
  277. default:
  278. break;
  279. }
  280. }
  281. }
    这部分的代码有点多,具体的注释都很清楚,我们主要理一理思路,先来继承关系
     
     
  1. class MainActivity extends BaseActivity implements MainView,
  2. NavigationView.OnNavigationItemSelectedListener,OnRefreshListener,View.OnClickListener
    首先继承了我们之前写好的基础activity类,继承了一些通用的设置和需要实现的方法,然后继承了还未见过真面目的MainView,将MainActivity设置为MainView的子类方便后面presenter传递获取的数据并显示,最后是继承的一些监听接口这里就不过多赘述了。然后整个架子过程就是:显示布局——>初始化presenter——>初始化view和数据(根据SharedPreferences保存的登录状态初始化navigation header的显示内容,未登录显示未登录状态点击进行登录,已登录显示账号和头像——>通过presenter加载数据——>加载数据完成后在继承MainView的 getFilmInfos ( Film film ) 的方法中实现添加内容到原有的list然后通知IRecyclerView刷新。)

    这篇就学习到这里,在首页中我们还有 MainView接口、 SharedPreferencesUtils MainPresenter MainRecyclerViewAdapter 没有完成,我们将在后面一步步的进行学习完成,下面贴出侧边栏导航的代码,方便学习
drawer_menu.xml
    
    
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  2. <group android:checkableBehavior="single">
  3. <item android:id="@+id/hobby"
  4. android:title="音乐与电影">
  5. <menu>
  6. <item android:title="首页" android:id="@+id/menu_home" android:icon="@drawable/menu_index"/>
  7. <item android:title="直播" android:id="@+id/menu_live" android:icon="@drawable/menu_live"/>
  8. <item android:title="搞笑段子" android:id="@+id/menu_duanzi" android:icon="@drawable/menu_funny"/>
  9. <item android:title="书城" android:id="@+id/menu_book" android:icon="@drawable/menu_book"/>
  10. <item android:title="电影" android:id="@+id/menu_movie" android:icon="@drawable/menu_film"/>
  11. <item android:title="音乐" android:id="@+id/menu_music" android:icon="@drawable/menu_music"/>
  12. </menu>
  13. </item>
  14. </group>
  15. <group android:checkableBehavior="single">
  16. <item android:id="@+id/more"
  17. android:title="更多">
  18. <menu>
  19. <item android:title="作者信息" android:id="@+id/menu_info" android:icon="@drawable/menu_coder"/>
  20. <item android:id="@+id/menu_about"
  21. android:icon="@drawable/menu_copyright"
  22. android:title="开源信息"/>
  23. <item android:id="@+id/menu_logout"
  24. android:icon="@drawable/menu_out"
  25. android:title="退出"/>
  26. </menu>
  27. </item>
  28. </group>
  29. </menu>

 

猜你喜欢

转载自blog.csdn.net/qq_28057577/article/details/78226084
今日推荐