17

私は以下のような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たが、それらは完璧に機能したので、ボタンを取得するのに十分な場所がないということですか?もっとスペースを与えようとしましたが、それでもうまくいきません。

私はToshibaAT100(1280 * 800)とランドスケープを使用しているので、十分なスペースがあります。テストbelowして、とright同じleftです。コントロールAを相対レイアウトに配置し、コントロールBを追加して、コントロールAの左側にあることをデカレーレすると、コントロールBがコントロールAを右にプッシュするはずです。

4

6 に答える 6

24

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

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

実際に見るスペースがあるので、使用するとのButton左側に配置されます(もう外にはありません)。で動作するのは、子を行または列に配置するため(向きに応じて)、特定の位置にaを追加すると、他の子を右または下に押します(向きに応じて)(相対的なものはありません)ビューの配置、唯一のルールは、子が次々に来ることです)。ListViewlayout_alignParentRight="true"ButtonaddView(View child, int index, LayoutParams params)LinearLayoutLinearLayoutViewViewsLinearLayout

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

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行がないButtonと、これはルールのない子ListViewの通常の動作であるため、重複します。RelativeLayout次に、の位置を明示的に変更ListViewして右に移動します(上記のコードの最後の2行を使用)。

于 2012-05-22T14:26:18.217 に答える
3

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

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

m_linearLayout.addView(button2, layoutParams);

編集

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

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

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
于 2012-05-22T11:42:57.023 に答える
3

これを実行するには、事前定義されたビューIDを使用するか、ビューIDを宣言します。値フォルダーにids.xmlを作成し、次のようなアイテムを追加します。

<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());
于 2016-05-24T15:13:41.610 に答える
1

またはの可視性を追加m_listViewするのを忘れているかもしれません。RelativeLayoutm_listViewGONE

確認してもらえますか?

于 2012-05-22T11:24:21.403 に答える
1

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

于 2013-12-12T03:23:46.180 に答える
0

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

于 2016-04-12T12:59:57.673 に答える