Fragment是Android里面中一个非常灵巧的设计,它可以看做ui模块,由活动托管。熟练的使用它们能优雅的实现很复杂的界面,而且用它们编写UI界面,相对于用一个个Activity所消耗内存少得多,而且切换很流畅,可以参考知乎客户端。
但是,Fragment使用过程中会出现一些小问题,这里讲如何在Fragment中添加menu。我们都知道在活动中添加menu只用编写好menu,在onCreateOptionsMenu中加载,并在onOptionsItemSelected中处理点击事件就可以了,按照这个流程先试下
首先编写menu.xml
这里只添加一个设置的menu item
然后要加载menu需要toolbar或actionbar,这里分两种情况:
然后再调用onCreateOptionsMenu加载到toolbar上
运行一下,你会发现两种情况下menu都没加载出来。原来要在fragment中加载menu还需在其onCreate中加一句 setHasOptionsMenu(true),用于让活动知道有menu要加载
现在menu加载出来了
然后重写onOptionsItemSelected处理点击事件
现在就大功告成了吗,然而运行后会发现无论怎么点击onOptionsItemSelected都没被调用。可以再android training中找到原因
http://developer.android.com/guide/topics/ui/actionbar.html
也就是说在虽然在fragment中重写onOptionsItemSelected,但系统会在activity中先调用onOptionsItemSelected,而活动中默认都消耗了点击事件,fragment中因此无法处理点击。所以要先在托管碎片的活动中讲frament中处理的menu item返回false,让点击事件能穿到fragment的onOptionsItemSelected中
总结下
要在fragment添加menu需要以下步骤:
菜单
菜单是UI设计中经常使用的组件,提供了不同功能分组展示的能力,在人机交互中提供了人性化的 *** 作。
Android中菜单分为两种类型:
选项菜单(Option Menu)
上下文菜单(Context Menu)
选项菜单
创建选项菜单的3个步骤:
重写Activity的onCreateOptionsMenu()方法,当第一次打开菜单时该方法被自动调用。
调用Menu的add()方法添加菜单项(MenuItem)
当菜单项被选择时,重写Activity的onOptionsItemSelected()方法来响应事件。
上下文菜单
上下文菜单的创建步骤:
覆盖Activity的onCreateContextMenu()方法,调用Menu的add()方法添加菜单项(MenuItem)。
覆盖onContextItemSelected()方法,响应菜单单击事件。
在Activity的onCreate()方法中,调用registerForContextMenu()方法,为视图注册上下文菜单。
长按控件
d出式菜单(popupMenu)
d出式菜单的创建步骤:
在res下创建menu文件夹,创建pop_menu.xml。
创建new PopupMenu(context,btn)。
调用getMenuInflater.inflater(R.menu.pop_menu,pop.getMenu())。
调用popmenu.show()
在res下穿件menu文件夹,
创建pop_menu.xml
ActionBar
一、显示和隐藏
(1)获取ActionBar
ActionBar actionBar = getSupportActionBar()
(2)判断是否显示
actionBar.isShowing()
(3)隐藏
actionBar.hide()
(4)显示
actionBar.show()
二、添加图标
1.always:总是显示在界面上
2.never:不显示在界面上,只让出现在右边的三个点中
3.ifRoom:如果有位置才显示,不然就出现在右边的三个点中
(1)res/menu创建menu_action.xml
(2)重写onCreateOptionsMenu
(3)重写onOptionsItemSelected
三、添加返回键
(1)onCreate方法添加
actionBar.setDisplayHomeAsUpEnabled(true)
(2)onOptionsItemSelected添加case
case android.R.id.home:
finish()
RecyclerView
1、添加依赖
implementation 'androidx.recyclerview:recyclerview:1.1.0'
2、初始化数据
for (int i= 0i<20i++){
list.add("标题"+i)
}
3、获取组建
recycleview = findViewById(R.id.recycleview)
4、设置方向
//第一个参数:Context
//第二个参数:方向 RecyclerView.HORIZONTAL || VERTICAL
//第三个参数:是否倒叙false
LinearLayoutManager manager =
new LinearLayoutManager
(RecyclerActivity.this,RecyclerView.HORIZONTAL,false)
recycleview.setLayoutManager(manager)
5、新建一个类MyRecyclerAdapter
在类里创建静态方法MyViewHolder 继承 RecyclerView.ViewHolder
6、MyRecyclerAdapter 继承
RecyclerView.Adapter
7、创建构造方法
8、实现里边的方法
public MyViewHolder onCreateViewHolder
9、实现里边的方法
MyViewHolder 获取组建
10、实现里边的方法
public void onBindViewHolder
public int getItemCount
11、Activity里创建MyRecyclerAdapter,并设置
MyRecyclerAdapter adapter = new MyRecyclerAdapter(this,list)
recycleview.setAdapter(adapter)
12、MyRecyclerAdapter 创建接口 OnMyChildClick
并且声明
并且提供设置接口的方法
13、RecyclerActivity的页面实现接口OnMyChildClick,重写里边的方法
14、RecyclerActivity的页面设置完适配器,设置OnMyChildClick
15、MyRecyclerAdapter
onAttachedToRecyclerView 方法
获取到recyclerView
16、MyRecyclerAdapter
public MyViewHolder onCreateViewHolder 方法
获取到view后设置点击事件
要想让menu按键显示在系统导航栏旁,需要改变AndroidManifest内的内的最小
sdk版本。最高为10,不得高于10,否则无法现实在系统导航栏旁。个人想法是:Android3.0后加入了ActionBar控件和虚拟的按键,而ActionBar整合了menu功能导致android3.0以上的menu按钮只能现实在ActionBar上,无法显示在系统导航栏旁。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)