GVKun编程网logo

android – onCreateOptionsMenu用片段命中倍数

13

本篇文章给大家谈谈android–onCreateOptionsMenu用片段命中倍数,同时本文还将给你拓展AndroidonCreateOptionsMenuonPrepareOptionsMenu

本篇文章给大家谈谈android – onCreateOptionsMenu用片段命中倍数,同时本文还将给你拓展Android onCreateOptionsMenu onPrepareOptionsMenu、Android onCreateOptionsMenu的使用方法总结、Android – Bundle savedInstanceState在Fragment onCreate()和onCreateView()中为null、android – onPrepareOptionsMenu在ActionBar中复制项目等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

android – onCreateOptionsMenu用片段命中倍数

android – onCreateOptionsMenu用片段命中倍数

我有两个ListFragments(A和B,实际上是SherlockListFragments),当我在两个片段中的onCreateOptionsMenu中放置一个断点时,片段A被击中3次而片段B被击中2次.另外,当AsyncTask正在运行时,我正在为菜单图标设置动画,如果我在片段A中选择一个项目,则再次调用onCreateOptionsMenu并将图标加倍:

我不确定为什么再次调用onCreateOptionsMenu因为我只是在“details”片段中调用一个方法:

@Override
public void onListItemClick(final ListView l,final View v,final int position,final long id)
{
    DetailsFragment fragment = (DetailsFragment)getFragmentManager().findFragmentById(R.id.fragmentDetails);

    if (fragment != null && fragment.isInLayout())
    {
        fragment.displayItems();
    } 
    else 
    {
        final Intent listing = new Intent(activity.getApplicationContext(),DetailsFragmentActivity.class);
        startActivity(listing);
    }
}

更新:

我正在使用此代码为菜单项设置动画:

private MenuItem refreshItem;   

private void DoRefresh() 
{
    final LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view,null);

    final Animation rotation = AnimationUtils.loadAnimation(activity,R.anim.refresh);
    ImageView ivRefresh.startAnimation(rotation);

    refreshItem.setActionView(ivRefresh);

    //AsyncTask is kicked off here
}

@Override
public boolean onoptionsItemSelected(final MenuItem item) 
{
    if (item.getItemId() == R.id.refresh) {
        refreshItem = item;
        this.DoRefresh();
        return true;
    } else {
        return super.onoptionsItemSelected(item);
    }
}

解决方法

从文档:

“在系统调用onCreateOptionsMenu()之后,它会保留您填充的菜单的实例,并且不会再次调用onCreateOptionsMenu(),除非由于某种原因菜单无效.但是,您应该仅使用onCreateOptionsMenu()来创建初始菜单状态而不是在活动生命周期中做出改变.“

我的猜测是,你正在做的事情使菜单无效. fragment.displayItems()有什么作用?

Android onCreateOptionsMenu onPrepareOptionsMenu

Android onCreateOptionsMenu onPrepareOptionsMenu

异步刷新menu :getActivity().supportInvalidateOptionsMenu();


onPrepareOptionsMenu

每次访问都重新填充菜单项


onCreateOptionsMenu 



1. onPrepareOptionsMenu()调用时机。

一般情况下,每次按menu键Framewrok都会先调用onPrepareOptionsMenu(),准备需要显示的菜单。但是当按menu键之前调用了Activity.invalidateOptionsMenu()之后,情况变的不一样,调用完Activity.invalidateOptionsMenu()之后,Framework会立即调用onPrepareOptionsMenu()准备好菜单项数据,之后当用户按menu键时,Framework不会再次调用onPrepareOptionsMenu(),而是将之前准备好的菜单显示出来。这点一定要注意。

2. 清除之前的menu数据。

每次调用onPrepareOptionsMenu()的时候需要首先调用menu.clear()清除一下之前的menu数据,如果不清除的话,之前的menu数据不会被释放,造成内存泄漏。





1、复写onPrepareOptionsMenu方法

 

@Override
 public void onPrepareOptionsMenu(Menu menu) {
  

  menu.clear();//先清除已经建好的menu


  MenuInflater inflater = getActivity().getMenuInflater();

//根据各种条件,重新设置menu

  if (isDeleteIconOnActionBar){
   inflater.inflate(R.menu.delete_action, menu);   
  }else if(isRefreshIconOnActionBar){ 
   inflater.inflate(R.menu.delete_refresh_action, menu);
  }else{
   inflater.inflate(R.menu.main_activity_actions, menu);
  }
  super.onPrepareOptionsMenu(menu);
 }

 

2、在需要修改menu的地方调用

getActivity().supportInvalidateOptionsMenu();




Android onCreateOptionsMenu的使用方法总结

Android onCreateOptionsMenu的使用方法总结

Android onCreateOptionsMenu的使用方法总结

任何一款软件都少不了对“菜单”的使用。在Android下,每一个activity都捆绑了一个Menu,要想定义和使用菜单,都必须在Activity下进行操作,复写onCreateOptionsMenu 和 onoptionsItemSelected这两个方法。举例如下:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
  //调用基类的方法,以便调出系统菜单(如果有的话) 
  super.onCreateOptionsMenu(menu); 
  menu.add(0,1,"重新开始").setIcon(R.drawable.refresh); 
  menu.add(0,2,"游戏指南").setIcon(R.drawable.help); 
  menu.add(0,3,"关于游戏").setIcon(R.drawable.info); 
  menu.add(0,4,"不想玩了").setIcon(R.drawable.exit); 
  //返回值为”true”,表示菜单可见,即显示菜单 
  return true; 
} 

看一看menu.add的方法中的参数:

第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。可以用到的方法有:

removeGroup(id) 
setGroupCheckable(id,checkable,exclusive) 
setGroupEnabled(id,boolean enabled) 
setGroupVisible(id,visible) 

个人认为,当你需要在不同场合下显示不同的menu的时候,合理使用这个参数将更为有效的处理菜单的显示。否则一般情况下都归为一组。

第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个Menu中的选项。在后面使用菜单的时候,就是靠这个item ID来判断,你选中的是哪个选项。

第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的顺序来显示。

第四个String类型的title参数,表示选项中显示的文字。

再看看setIcon方法,就是为菜单添加图标显示,使用用资源文件。

设计好了菜单,继续复写onoptionsItemSelected方法,用以对菜单的响应,示例代码:

@Override 
public boolean onoptionsItemSelected(MenuItem item) 
{ 
  super.onoptionsItemSelected(item); 
  switch(item.getItemId()){ 
    case 1: 
      //处理代码 
      break; 
    case 2: 
      //处理代码 
      break; 
    case 3: 
      //处理代码 
      break; 
    case 4: 
      finish(); 
      break; 
   } 
  return true; 
}

以上就是Android onCreateOptionsMenu的参数详细介绍,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助大家,谢谢大家对本站的支持!

Android – Bundle savedInstanceState在Fragment onCreate()和onCreateView()中为null

Android – Bundle savedInstanceState在Fragment onCreate()和onCreateView()中为null

我试图将参数传递给片段.

单击片段视图时,我将片段替换为另一个片段并将数据传递给下一个片段.

我的点击动作:

public void onClick(View view) {
    Bundle args = new Bundle();
    args.putSerializable("order", orders.get(position));
    OrderDetailFragment orderDetailFragment = new OrderDetailFragment();
    orderDetailFragment.setArguments(args);
    FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.order_activity_content_frame, orderDetailFragment)
            .addToBackStack("orderDetails")
            .commit();
}

但是在我的目标Fragment中,savedInstanceState将变为null.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    order = (Order) savedInstanceState.getSerializable("order");

    View rootView = inflater.inflate(R.layout.fragment_order_details, container, false);
    TextView date = (TextView) rootView.findViewById(R.id.order_detail_date);
    date.setText((CharSequence) order.getCreatedOn());
    return rootView;
}

我无法弄清楚到底错过了什么?

解决方法:

savedInstanceState包含保存在onSaveInstanceState()中的数据,该数据在您的活动/片段被OS杀死之前调用(例如,回收内存,或者因为方向更改).

调用getArguments()以获取使用setArguments()保存的Bundle:

order = (Order) getArguments().getSerializable("order");

此外,建议使用参数实例化Fragment的做法是通过静态newInstance()方法,如下所示:

public static OrderDetailFragment newInstance(Order order) {
    Bundle args = new Bundle();
    args.putSerializable(KEY_ORDER, order);
    OrderDetailFragment fragment = new OrderDetailFragment();
    fragment.setArguments(args);
    return fragment;
}

然后你像这样实例化你的片段:

OrderDetailFragment orderDetailFragment = OrderDetailFragment
    .newInstance(orders.get(position));

android – onPrepareOptionsMenu在ActionBar中复制项目

android – onPrepareOptionsMenu在ActionBar中复制项目

当我使用onPrepareOptionsMenu添加菜单项时,菜单项会在操作栏中复制其自身.我正在使用片段并在主要活动的ActionBar中创建初始菜单,如下所示:

...
 @Override
    public boolean onCreateOptionsMenu(Menu paramMenu) {
    super.onCreateOptionsMenu(paramMenu);
    paramMenu.add(0, 1, 0, "DashBoard").setIcon(R.drawable.ic_dashboard)
        .setShowAsAction(1);
    return true;
    }

然后我在其中一个片段中添加另一个项目如下:

...
@Override
    public void onPrepareOptionsMenu(Menu paramMenu) {
    paramMenu.add(0, 2, 1, "FullScreen").setIcon(R.drawable.ic_fullscreen)
        .setShowAsAction(1);
    }

由于某种原因,通过片段类添加的项目显示两次….我有什么不对吗?

对我的错误的任何帮助将不胜感激

解决方法:

该项目可能会显示两次,因为您要添加两次.见docs for onPrepareOptionsMenu

This is called right before the menu is shown, every time it is shown.

我真的不会盲目地在onPrepareOptionsMenu中添加一个项目.您应该检查它是否已经先添加.

我们今天的关于android – onCreateOptionsMenu用片段命中倍数的分享就到这里,谢谢您的阅读,如果想了解更多关于Android onCreateOptionsMenu onPrepareOptionsMenu、Android onCreateOptionsMenu的使用方法总结、Android – Bundle savedInstanceState在Fragment onCreate()和onCreateView()中为null、android – onPrepareOptionsMenu在ActionBar中复制项目的相关信息,可以在本站进行搜索。

本文标签: