2013-11-28 2 views
0

Предположим, у меня есть две кнопки в RelativeLayout. Кнопка с надписью «один» вверху и кнопка с надписью «три» под «одним». Макет определяется следующим образом. RelativeLayout вставить точку зрения между двумя другими

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:id="@+id/mainContainer" 
    tools:context=".MainActivity" > 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tvOne" 
     android:layout_centerHorizontal="true" 
     android:layout_alignParentTop="true" 
     android:text="One" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tvThree" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@id/tvOne" 
     android:text="Three" /> 
</RelativeLayout> 

Так что я написал код в onCreate из MainActivity динамически создавать Button, и вставьте его между одним и тремя. Но он не работает. Есть что-то, что мне не хватает? Я создал этот вопрос как упрощенную версию более крупной проблемы, с которой я столкнулся, поэтому для меня неприемлемо очистить макет и просто вставить один-два и три динамически.

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button one = (Button)findViewById(R.id.tvOne); 
    Button three = (Button)findViewById(R.id.tvThree); 

    //Dynamically create a button, set it underneath one and above two. 
    Button two = new Button(this); 
    two.setText("TWO TWO TWO TWO TWO TWO TWO"); 

    //Create some layout params so that this button is horizontally centered, 
    //above button number three and below button number one 
    final int WC = RelativeLayout.LayoutParams.WRAP_CONTENT; 
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(WC, WC); 
    params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 
    params.addRule(RelativeLayout.BELOW, one.getId()); 
    params.addRule(RelativeLayout.ABOVE, three.getId()); 

    two.setLayoutParams(params); 

    //Add button number two to the activity. 
    RelativeLayout rl = (RelativeLayout)findViewById(R.id.mainContainer); 
    rl.addView(two); 
} 
+0

где третья кнопка становится добавление сейчас .. –

+0

не меняет layoutparams на кнопку три .. так что всегда допустимый «андроид: layout_below =» @ идентификатор/tvOne «» , – fasteque

+0

Может быть, это может вам помочь: http://stackoverflow.com/questions/12524589/how-can-we-add-buttons-at-dynamic-positions-in-layout –

ответ

3

Рабочий код и I проверили это.

public class Main extends Activity { 

    Context ctx; 
    RelativeLayout rlayMainContainer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ctx = this; 

     rlayMainContainer = (RelativeLayout) findViewById(R.id.mainContainer); 
     Button one = (Button) findViewById(R.id.tvOne); 
     Button three = (Button) findViewById(R.id.tvThree); 


     // adding button two dynamically 
     Button two = new Button(ctx); 
     two.setText("hello"); 
     two.setId(12); 

     RelativeLayout.LayoutParams lpSecond = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     lpSecond.addRule(RelativeLayout.CENTER_HORIZONTAL); 
     lpSecond.addRule(RelativeLayout.BELOW, one.getId()); 

     rlayMainContainer.addView(two, lpSecond); 

     //align button three below button two 

     RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) three 
       .getLayoutParams(); 

     params.addRule(RelativeLayout.BELOW, two.getId()); 

     three.setLayoutParams(params); 
    } 
} 

enter image description here

+0

Да это работает !!! Спасибо за помощь –

0

В самом деле, кнопка «два» есть, но вы не можете видеть его, потому что его высота = 0. Эти строки кода делают «два» высоты баттона = 0

params.addRule(RelativeLayout.BELOW, one.getId()); 
params.addRule(RelativeLayout.ABOVE, three.getId()); 

Да, макет кнопки «две» указывает, что он должен быть между «одним» и «три», но между этими кнопками нет пробела -> без высоты.

Чтобы решить эту проблему, необходимо удалить строку, установите «два» выше «три» и добавить код, чтобы указать, что «три» сейчас ниже «два»

 final int WC = RelativeLayout.LayoutParams.WRAP_CONTENT; 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
       WC, WC); 
     params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 
     params.addRule(RelativeLayout.BELOW, one.getId()); 

     two.setLayoutParams(params); 

     // Add button number two to the activity. 
     RelativeLayout rl = (RelativeLayout) findViewById(R.id.mainContainer); 
     rl.addView(two); 

     two.setId(1); 
     params = (LayoutParams) three.getLayoutParams(); 
     params.addRule(RelativeLayout.BELOW, two.getId()); 
     three.setLayoutParams(params); 
+0

Теперь я получаю круглую справочную проблему, которую я не могу решить. –

+0

К сожалению, как я уже говорил выше: удалите строку, которая устанавливает «два» над «тремя». (Я отредактировал код) –

Смежные вопросы