2012-05-22 26 views
14

を働いていない「RelativeLayout.LEFT_OF」ルールを追加します。JavaコードでRelativeLayoutは、私は以下のように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> 

を、私はリストビューの左側にビューを追加したいが、それはしませんでした働い:

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にリストビューを設定した場合にのみ、それが動作します。これはアンドロイドのバグですか、何か不足していますか?

私はいつもaddView(View child, int index, LayoutParams params)を試していますが、リニアレイアウトでしか動作しない可能性があります。だから、RelativeLayout.LEFT_OFを動作させるための通常の解決法はありますか?

EDIT

私はRelativeLayout.BELOWRelativeLayout.RIGHT_OFを試してみました、そして、彼らは完璧に働いていたので、それは私がボタンを取得するのに十分な場所を持っていないことを意味?スペースを増やそうとしましたが、それでも動作しません。

私は東芝AT100(1280 * 800)と風景を使用しているので、十分なスペースです。試験belowおよびrightは、leftとまったく同じです。私は、私は、relativelayoutでコントロールAを入れたら、私はコントロールBを追加し、コントロールAの左にあるデカール結果は、コントロールBは右にコントロールAを押すだろうか?

+0

ビューはどこに表示されますか? – Barak

+0

relativelayoutはアクティビティのメインビューで、ボタンを追加するスペースがあります。 – dreamtale

+0

私は実際には、ボタンが表示されない、または不適切な場所に表示されますか? – Barak

答えて

22

IDを呼び出してみてください

は、たぶん私は私がrelativelayoutで制御Aを入れた場合、私は、コントロールBを追加し、それがコントロールの左側にあります宣言だと思いますA、結果はコントロールBがコントロールAを右に押します。

RelativeLayout.LayoutParamsルールで指定しない限り、コントロールAは正しくプッシュされません。 RelativeLayoutは、配置ルールを指定していない場合、画面の左上隅から順に1つずつ上に配置します。任意の規則(layout_alignParentRightなど)を使用せずに AをRelativeLayoutに追加すると、画面の左上隅から配置されます。次に、View Bを追加すると、to_leftOfというルールがこのViewポジションに適用されますが、このルールは、画面上でそのポジションを維持する人物のViewAを意味するものではありません。これによりView BがViewの左に配置されますが、画面の外側にはViewと表示されます。境界は画面の左端から開始します。あなたがlayout_alignParentRight="true"を使用する場合、実際にButtonを参照するにはスペースが今ありますので

Buttonは(それはもう外ではありません)ListViewの左側に配置されます。 LinearLayoutLinearLayoutの子を行または列に配置するため(向きに応じて)、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行を使用)。

+0

私は東芝AT100(1280 * 800)とランドスケープを使用しているので、 'left'と同じ' 'below''と' 'right''テストで十分です。私は、私は、relativelayoutでコントロールAを入れたら、コントロールBを追加し、それがコントロールAの左にあることをデカールすると、結果はコントロールBになるはずです。 – dreamtale

+0

@dreamtale初めて質問を誤解しました。私は自分の答えを編集しました。 – Luksprog

+0

あなたの精巧な答えをありがとう、私はそれが働いた:) – dreamtale

1

m_listViewRelativeLayoutに、またはm_listViewの可視性をGONEに追加することを忘れた可能性があります。

ご確認ください。

+0

XMLにレイアウトが表示されます。 – dreamtale

+0

私はあなたが相対レイアウトのレイアウトパラメータを設定しているのを見ることができますが、リニアレイアウトでボタンを追加しています。 Eitでは、RelativeLayoutではなくLinearLayout.LayoutParamsを使用します。LayoutParamsまたはRelativeLayoutのインスタンスのaddViewメソッドを呼び出します。 – bhavindesai

+0

私の編集した質問をご覧ください。 – dreamtale

2

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

m_linearLayout.addView(button2, layoutParams); 

EDIT

あなたはalignParentRight作品を言う...アンカーパラメータを取らないことOTがある唯一の違い:

この行は、私が話しているものです。おそらくm_listView.getId()が正しいIDを返していない可能性があります。デバッガをステップバイステップで実行し、適切な値が返されているかどうかを確認することができます。あなたは、具体的...

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list); 
+0

私はlinearlayoutを使うべきですか?詳細を教えていただけますか? – dreamtale

+0

いいえ、RelativeLayoutのルールを動作させるためには、RelativeLayoutにビューを追加する必要があります。そのビュー参照には 'm_linearlayout'と表示されています。私には、RelativeLayoutの代わりにLinearLayoutにビューを追加しようとしています。 'm_linearlayout'リファレンスをどこに設定したかわからないので、適切な名前を使用していると仮定しています。 'm_linearlayout =(RelativeLayout)this.findViewById(R.id.parent)'がある場合を除いて、あなたの相対レイアウトの参照名が非常に貧弱だと言えます。 – Barak

+0

申し訳ありません、私は前のプロジェクトでそれを試して、 'LinearLayout'を' RelativeLayout'に置き換え、変数名を変更しないでください。私は質問を編集しています。 – dreamtale

1

setId before alignは、特に新しいオブジェクトビューに対して呼び出されます。

0

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

2

これを実行するには、定義済みビューIDを使用するか、または1を宣言します。

<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); 
値でフォルダは次のように 項目を追加し ids.xmlを作成します

または直接この機能を使用することができますView.generateViewId()同じを実行する。このように:

imageView.setId(View.generateViewId()); 
関連する問題