What should I pass for root when inflating a layout to use for a MenuItem's ActionView?

后端 未结 3 1522
暖寄归人
暖寄归人 2021-02-01 14:23

I have an ImageView that I attach to a MenuItem as its ActionView (the item appears in the ActionBar). The layout for this vi

相关标签:
3条回答
  • 2021-02-01 14:32

    I would simply do it like this:

    menuItem.setActionView(R.layout.action_view_layout);
    

    Let Android inflate the view for you.

    If you need to do some extra changes on this ImageView call

    ImageView imageView = (ImageView) menuItem.getActionView();
    

    Update

    In order to cater to your curiosity. That is what folks from Google do under the hood:

    public MenuItem setActionView(int resId) {
        final Context context = mMenu.getContext();
        final LayoutInflater inflater = LayoutInflater.from(context);
        setActionView(inflater.inflate(resId, new LinearLayout(context), false));
        return this;
    }
    
    0 讨论(0)
  • 2021-02-01 14:42

    You generally want to pass whatever (ViewGroup sub-class) you're going to be adding actionView to in to inflate. in order to get actionView back from the inflate call and not the parent you'll want to add a 3rd parameter, false, so that it won't add the inflated view to the parent.

    ImageView actionView = 
        (ImageView)layoutInflater.inflate(R.layout.action_view_layout, parent, false);
    // .. do whatever you like with actionView and then add it to it's parent
    menuItem.addActionView(actionView)
    

    There's a pretty good tutorial here that goes about things a little differently. It's specifying action_view_layout as part of menu.xml with something like:

    android:actionLayout="@layout/action_view_layout"
    

    That may also work for you provided you're always using the same layout. if you go that route you'd be able to get the ActionView by doing

    ImageView actionView = menu.findItem(R.id.whatever).getActionView();
    
    0 讨论(0)
  • 2021-02-01 14:46

    You have look on this. it nicely explains the Layout Inflator as well.

    There are two usable versions of the inflate() method for a standard application:

    inflate(int resource, ViewGroup root)
    inflate(int resource, ViewGroup root, boolean attachToRoot)
    

    The first parameter points to the layout resource you want to inflate. The second parameter is the root view of the hierarchy you are inflating the resource to attach to. When the third parameter is present, it governs whether or not the inflated view is attached to the supplied root after inflation.

    It is these last two parameters that can cause a bit of confusion. With the two parameter version of this method, LayoutInflater will automatically attempt to attach the inflated view to the supplied root. However, the framework has a check in place that if you pass null for the root it bypasses this attempt to avoid an application crash.

    Many developers take this behavior to mean that the proper way to disable attachment on inflation is by passing null as root; in many cases not even realizing that the three parameter version of inflate() exists.

    More on Layout Inflation

    0 讨论(0)
提交回复
热议问题