web-dev-qa-db-ja.com

RelativeLayout追加ルール「RelativeLayout.LEFT_OF」が機能しない

以下のようなrelativeLayoutがあります:

_<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="horizontal"
    Android:id="@+id/parent" >

    <ListView 
        Android:layout_width="360dp"
        Android:layout_height="600dp"
        Android:id="@+id/list"
        Android:inputType="text"
        Android:maxLines="1"
        Android:layout_margin="50dp"
        Android:layout_alignParentRight="true"
        />
</RelativeLayout>
_

Javaコードで、リストビューの左側にビューを追加したいのですが、うまくいきませんでした:

_m_relativeLayout = (RelativeLayout)findViewById(R.id.parent);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId());
Button button2 = new Button(this);
button2.setText("I am button 2");
m_relativeLayout.addView(button2, layoutParams);
_

リストビューをalignParentRightに設定した場合にのみ機能します。これはAndroidバグですか、それとも何か不足していますか?

私は常にaddView(View child, int index, LayoutParams params)を試しますが、linearlayoutでしか機能しない可能性があります。それで、_RelativeLayout.LEFT_OF_を機能させるための通常の解決策はありますか?

[〜#〜]編集[〜#〜]

私は_RelativeLayout.BELOW_と_RelativeLayout.RIGHT_OF_を試してみましたが、それらは完全に機能したので、ボタンを取得するのに十分な場所がないことを意味しますか?私はもっ​​とスペースを与えようとしましたが、それでもうまくいきません。

東芝AT100(1280×800)とランドスケープを使用しているので、十分なスペースがあります。 belowと同じようにrightleftをテストします。相対レイアウトにコントロールAを配置し、コントロールBを追加して、それをコントロールAの左側に配置すると、コントロールBはコントロールAを右側にプッシュします。

16
dreamtale

相対レイアウトにコントロールAを配置し、コントロールBを追加して、それがコントロールAの左側にあることを宣言すると、結果としてコントロールBがコントロールAをその右側にプッシュします。

あなたの仮定は正しくありません。これを_RelativeLayout.LayoutParams_ルールで指定しない限り、コントロールAは右にプッシュされません。 RelativeLayoutは、子の配置規則を指定しない場合、画面の左上隅から順に子を1つずつ配置します。 View AをRelativeLayoutにルールなしで追加すると(_layout_alignParentRight_など)、画面の左上隅から配置されます。次に、View Bを追加すると、ルール_to_leftOf_がこのViewの位置に適用されますが、このルールは、画面上の位置を維持するView Aには何も意味しません。これにより、View BがView Aの左側に配置されますが、View Aのように画面の外側にあります。境界は画面の左境界から始まります。

_layout_alignParentRight="true"_を使用すると、ButtonListViewの左側に配置されます。これは、Buttonを実際に見るためのスペースができたためです(もう外にはありません)。 addView(View child, int index, LayoutParams params)LinearLayoutで機能します。これは、LinearLayoutが子を行または列に配置するため(方向に応じて)、特定の位置にViewを追加すると、他のViewsが右側にプッシュされます。以下(方向によって異なります)(LinearLayoutにはビューの相対的な配置はありません。唯一のルールは、子が順番に来るということです)。

ルールが設定されていないListViewから始めて、ButtonListViewの左側に表示する方法の例を次に示します。

_RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
Button button2 = new Button(this);
button2.setText("I am button 2");
button2.setId(1000);
m_relativeLayout.addView(button2, layoutParams);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView
            .getLayoutParams();
rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId());
_

ボタンは通常どおり画面に追加され、画面の左上隅から表示されます。上記のコードの2行がない場合、ButtonListViewは、ルールがない子のRelativeLayoutの通常の動作であるため、重複します。次に、ListViewの位置を明示的に変更して、右に移動します(上記のコードの最後の2行で)。

24
Luksprog

変数名がわかりやすい場合は、ウィジェットをLinearLayoutに追加しているため、RelativeLayoutのタグは無視されます。

この行は私が話しているものです:

_m_linearLayout.addView(button2, layoutParams);
_

[〜#〜]編集[〜#〜]

あなたはalignParentRightがうまくいくと言います...唯一の違いはotがアンカーパラメータを取らないことです。おそらくm_listView.getId()が適切なIDを返していません。デバッガーをステップ実行して、デバッガーが適切な値を返すかどうかを確認できます。

多分あなたは具体的にIDを呼び出すことを試みることができます...

_layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
_
3
Barak

これを実行するには、事前定義ビュー[〜#〜] id [〜#〜]を使用するか、宣言します。 values folder create ids.xmlに、次のようにItemを追加します。

<item name="imageViewID" type="id"/>

次のように、ビューの新しいインスタンスを作成するコードでこのIDを使用します。

RelativeLayout layout=new RelativeLayout(context);

ImageView imageView = new ImageView(context);
imageView.setId(R.id.imageViewID);

RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(imageView, layoutParams);

TextView  textView = new TextView(context);

RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
textViewParams.addRule(RelativeLayout.BELOW, imageView.getId());
layout.addView(nameView, nameLayoutParams);

または、この関数View.generateViewId()を直接使用して同じことを実行できます。このような:

imageView.setId(View.generateViewId());
3

RelativeLayoutm_listViewを追加するのを忘れたのではないかと思います。またはm_listViewの可視性はGONEになります。

確認して頂けますか?

1
bhavindesai

特に新しいオブジェクトビューの場合、alignの前にsetIdが呼び出されます。

1
user3093743

通常の生成されたAndroid id(例:R.id.my_id)ではなく、カスタムIDを使用している場合、IDが0(または負)と等しくないことを確認してください。それ以外の場合は、ルールは無視されます。

0
PatrickNLT