开发者

Layout params of loaded view are ignored

开发者 https://www.devze.com 2023-02-16 17:39 出处:网络
I\'m trying to write my own custom View and I have problem with LayoutParams. The idea is to extend ViewGroup (LinearLayout)

I'm trying to write my own custom View and I have problem with LayoutParams.

The idea is to extend ViewGroup (LinearLayout)

public class MyView extends LinearLayout{
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyView(Context context) {
        super(context);
    }
    public void putContent(){
        setOrientation(HORIZONTAL);
        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        for (int i = 0; i < 5; i++){
            View view = inflater.inflate(R.layout.item, null);
            TextView tv = (TextView)view.findViewById(R.id.item_text);
            tv.setText("Item " + i);
            addView(view);
        }
    }
}

As you can see putContent method inflates an items and adds to my view. Here is an item layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
    <TextView android:text="TextView"
    android:id="@+id/item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#000000"/>
</LinearLayout>

And main screen layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:orientation="vertical">
<TextView  
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android_layout_weig开发者_如何学JAVAht="1" 
    android:text="@string/hello"
    />
    <my.test.MyView
    android:id="@+id/my_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android_layout_weight="1"
    />
</LinearLayout>

And activity code

public class Start extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MyView myView = (MyView)findViewById(R.id.my_view);
        myView.putContent();
    }
}

Here is screenshot of what i get

Layout params of loaded view are ignored

So problem is: attributes of item's root element is ignored

android:layout_width="match_parent"
android:layout_height="match_parent"

But in result I want to get something like this (I get this result when replace addView(view); with this line)

addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));

Layout params of loaded view are ignored

So question is: how I can achieve this result without hard coded LayoutParams ? Thanks for any help!

update

I also look at the view variable fields in debug mode - the mLayoutParams is null, and became not null when I add inflated view into parent with addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));.

Layout params of loaded view are ignored

But mLayoutParams of child of just-loaded view is not null. Why LayoutParams of only root element in xml layout are ignored when view inflated?


Use following statement to inflate:

View view = inflater.inflate( R.layout.item /* resource id */,
                                         MyView.this /* parent */,
                                         false /*attachToRoot*/);


Ok, if I understand correctly, you have the XML mentioned above in ll, and you're adding something (R.layout.item_layout) to it.

The problems I see are:

  • Your base layout (the xml that was given, loaded into ll) has match_parent, but we do not know if it even has a parent. So the behaviour is hard to guess.
  • You did not specify what the layout params are for the item you're adding (still assuming R.layout.item_layout is not the xml you've shown). So it could be expected behaviour, or even undefined (so expected that it is unexpected).

It could be there's too much code to post here, I don't know, but then you might be better off using the hierarchy viewer to check out what params the views in your tree have, so you can actually see what's going on.

Also, mind that not all Views support margin.

Even though a view can define a padding, it does not provide any support for margins. However, view groups provide such a support. Refer to ViewGroup and ViewGroup.MarginLayoutParams for further information.


In Android "layout_" parameters refer to the the way the current View behaves in its parent layout. In this case, its parent is ll, but we can't see what that is.

As for the layout of the TextView inside the LinearLayout, since the LinearLayout is vertical, all its children automatically have their layout_height overridden by "wrap_content" so that they can be laid out one beneath the other properly.

So now the question is, what do you actually see and what do you want to see?

0

精彩评论

暂无评论...
验证码 换一张
取 消