How to Programmatically Add Views to Views

后端 未结 7 647
春和景丽
春和景丽 2020-11-22 12:55

Let\'s say I have a LinearLayout, and I want to add a View to it, in my program from the Java code. What method is used for this? I\'m not asking how it\'s done

相关标签:
7条回答
  • 2020-11-22 13:32

    You guys should also make sure that when you override onLayout you HAVE to call super.onLayout with all of the properties, or the view will not be inflated!

    0 讨论(0)
  • 2020-11-22 13:33

    Calling addView is the correct answer, but you need to do a little more than that to get it to work.

    If you create a View via a constructor (e.g., Button myButton = new Button();), you'll need to call setLayoutParams on the newly constructed view, passing in an instance of the parent view's LayoutParams inner class, before you add your newly constructed child to the parent view.

    For example, you might have the following code in your onCreate() function assuming your LinearLayout has id R.id.main:

    LinearLayout myLayout = findViewById(R.id.main);
    
    Button myButton = new Button(this);
    myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                         LinearLayout.LayoutParams.MATCH_PARENT,
                                         LinearLayout.LayoutParams.MATCH_PARENT));
    
    myLayout.addView(myButton);
    

    Making sure to set the LayoutParams is important. Every view needs at least a layout_width and a layout_height parameter. Also getting the right inner class is important. I struggled with getting Views added to a TableRow to display properly until I figured out that I wasn't passing an instance of TableRow.LayoutParams to the child view's setLayoutParams.

    0 讨论(0)
  • 2020-11-22 13:33

    for anyone yet interested:

    the best way I found is to use the inflate static method of View.

    View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);
    

    where yourViewXML is something like R.layout.myView

    please notice that you need a ViewGroup in order to add a view (which is any layout you can think of)

    so as an example lets say you have a fragment which it view already been inflated and you know that the root view is a layout, and you want to add a view to it:

        View view = getView(); // returns base view of the fragment
        if (view == null)
            return;
        if (!(view instanceof ViewGroup))
            return;
    
        ViewGroup viewGroup = (ViewGroup) view;
        View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
    
    0 讨论(0)
  • 2020-11-22 13:37

    This is late but this may help someone :) :) For adding the view programmatically try like

    LinearLayout rlmain = new LinearLayout(this);      
    LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
    LinearLayout   ll1 = new LinearLayout (this);
    
    ImageView iv = new ImageView(this);
    iv.setImageResource(R.drawable.logo);              
    LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    
    iv.setLayoutParams(lp);
    ll1.addView(iv);
    rlmain.addView(ll1);              
    setContentView(rlmain, llp);
    

    This will create your entire view programmatcally. You can add any number of view as same. Hope this may help. :)

    0 讨论(0)
  • 2020-11-22 13:45

    One more way to add view from Activity

    ViewGroup rootLayout = findViewById(android.R.id.content);
    rootLayout.addView(view);
    
    0 讨论(0)
  • 2020-11-22 13:54

    LinearLayout is a subclass of ViewGroup, which has a method called addView. The addView method should be what you are after.

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