web-dev-qa-db-ja.com

ロードされたビューのレイアウトパラメータは無視されます

独自のカスタムViewを記述しようとしていますが、LayoutParamsに問題があります。

アイデアはViewGroupLinearLayout)を拡張することです

_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);
        }
    }
}
_

ご覧のとおり、putContentメソッドはアイテムを膨らませてビューに追加します。こちらがアイテムレイアウトです

_<?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>
_

そしてメイン画面のレイアウト

_<?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_weight="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>
_

そして活動コード

_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();
    }
}
_

ここに私が得るもののスクリーンショットがあります

enter image description here

だから問題は:アイテムのルート要素の属性が無視される

_Android:layout_width="match_parent"
Android:layout_height="match_parent"
_

しかし、結果として私はこのようなものを取得したいです(addView(view);をこの行で置き換えると、この結果が得られます)。

_addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));
_

enter image description here

だから問題は、ハードコーディングされたLayoutParamsなしでこの結果をどのように達成できるかです。助けてくれてありがとう!

更新

また、デバッグモードでview変数フィールドを確認します。mLayoutParamsnullであり、インフレートされたviewaddView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));。 enter image description here

しかし、ロードされたばかりのビューの子のmLayoutParamsはnullではありません。ビューがインフレートされたときに、xmlレイアウトのルート要素のみのLayoutParamsが無視されるのはなぜですか?

38
Max Komarychev

次のステートメントを使用して膨張させます。

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

OK、私が正しく理解していれば、上記のXMLがllにあり、何かを追加しています(R.layout.item_layout)に。

私が見る問題は:

  • 基本レイアウト(与えられたllにロードされたxml)にはmatch_parentですが、親がいるかどうかはわかりません。そのため、動作を推測するのは困難です。
  • 追加するアイテムのレイアウトパラメータを指定していません(まだR.layout.item_layoutは表示したxmlではありません)。そのため、動作が予期されるか、または定義されていない可能性があります(予期しないことが予想されます)。

ここに投稿するにはコードが多すぎる可能性がありますが、わかりませんが、 hierarchy viewer を使用して、ツリー内のビューのパラメーターを確認することをお勧めします。何が起こっているのか実際に見てください。

また、 すべてのビューがマージンをサポートしているわけではない であることにも注意してください。

ビューはパディングを定義できますが、マージンはサポートされません。ただし、ビューグループはそのようなサポートを提供します。詳細については、ViewGroupおよびViewGroup.MarginLayoutParamsを参照してください。

0
Nanne

Android "layout_"パラメータは、現在のビューがその親レイアウトでどのように動作するかを示します。この場合、その親はllですが、それが何であるかはわかりません。

LinearLayout内のTextViewのレイアウトについては、LinearLayoutは垂直であるため、そのすべての子は自動的にそれらのlayout_heightが「wrap_content」によってオーバーライドされ、上下に適切にレイアウトできるようになります。

だから今問題は、あなたは実際に何を見て、何を見たいですか?

0
Tal Pressman