Fragment中添加menu

Fragment中添加menu,第1张

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上,无法显示在系统导航栏旁。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11526174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存