2014-01-02 2 views
-1

Я делаю приложение для Android, и я хочу скопировать некоторый код XML в Linear Layout и снова вставить его в Linear Layout так, что есть два из Relative Layouts в Линейная компоновка. Я хотел бы сделать это динамически, принимая этот код ниже:Как добавить копию XML динамически

<LinearLayout 
     android:id="@+id/tileContainerME" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <RelativeLayout 
     android:id="@+id/tilesAreHERE" 
     android:layout_width="207dp" 
     android:layout_height="151dp" > 

     <TextView 
      android:id="@+id/bottom1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/top1" 
      android:layout_alignParentBottom="true" 
      android:gravity="center_horizontal" 
      android:text="1" 
      /> 

     <TextView 
      android:id="@+id/left1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:gravity="center_vertical" 
      android:text="2" 
      /> 

     <TextView 
      android:id="@+id/right1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBaseline="@+id/left1" 
      android:layout_alignBottom="@+id/left1" 
      android:layout_alignParentRight="true" 
      android:gravity="center_vertical" 
      android:text="3" 
      /> 

     <TextView 
      android:id="@+id/top1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:gravity="center_horizontal" 
      android:text="4" 
      /> 

    </RelativeLayout>    
    </LinearLayout> 

, а затем просто превратить его в это:

<LinearLayout 
     android:id="@+id/tileContainerME" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 
     <RelativeLayout 
     android:id="@+id/tilesAreHERE" 
     android:layout_width="207dp" 
     android:layout_height="151dp" > 

     <TextView 
      android:id="@+id/bottom1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/top1" 
      android:layout_alignParentBottom="true" 
      android:gravity="center_horizontal" 
      android:text="1" 
      /> 

     <TextView 
      android:id="@+id/left1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:gravity="center_vertical" 
      android:text="2" 
      /> 

     <TextView 
      android:id="@+id/right1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBaseline="@+id/left1" 
      android:layout_alignBottom="@+id/left1" 
      android:layout_alignParentRight="true" 
      android:gravity="center_vertical" 
      android:text="3" 
      /> 

     <TextView 
      android:id="@+id/top1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:gravity="center_horizontal" 
      android:text="4" 
      /> 

    </RelativeLayout> 

     <RelativeLayout 
     android:id="@+id/tilesAreHERE" 
     android:layout_width="207dp" 
     android:layout_height="151dp" > 

     <TextView 
      android:id="@+id/bottom1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/top1" 
      android:layout_alignParentBottom="true" 
      android:gravity="center_horizontal" 
      android:text="1" 
      /> 

     <TextView 
      android:id="@+id/left1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:gravity="center_vertical" 
      android:text="2" 
      /> 

     <TextView 
      android:id="@+id/right1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBaseline="@+id/left1" 
      android:layout_alignBottom="@+id/left1" 
      android:layout_alignParentRight="true" 
      android:gravity="center_vertical" 
      android:text="3" 
      /> 

     <TextView 
      android:id="@+id/top1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:gravity="center_horizontal" 
      android:text="4" 
      /> 

    </RelativeLayout>     
    </LinearLayout> 

Посмотрите, как там будет два раздела RelativeLayout ... Я хотел бы в основном сделать копию одного, а затем добавить его обратно (я действительно не знаю, сколько раз я мог бы сделать это в своей программе, поэтому я буквально не вставляю его в XML, я бы хотел сделать это из кода Java). Это то, что у меня есть, но всякий раз, когда я его запускаю, макет неправильный. Что может быть неправильным с моим кодом?

  LinearLayout m3 = (LinearLayout)findViewById(R.id.tileContainerME); 
    RelativeLayout m = (RelativeLayout)findViewById(R.id.tilesAreHERE);  
    RelativeLayout m2 = new RelativeLayout(this); 

    m2.setLayoutParams(m.getLayoutParams()); 
    m2.setGravity(m.getGravity()); 
    m2.setLayoutDirection(m.getLayoutDirection()); 


    TextView et1 = (TextView) findViewById(R.id.bottom1); 
    TextView et2 = (TextView) findViewById(R.id.left1); 
    TextView et3 = (TextView) findViewById(R.id.right1); 
    TextView et4 = (TextView) findViewById(R.id.top1); 

    TextView tv1 = new TextView(et1.getContext()); 
    TextView tv2 = new TextView(et2.getContext()); 
    TextView tv3 = new TextView(et3.getContext()); 
    TextView tv4 = new TextView(et4.getContext()); 

    tv1.setLayoutDirection(et1.getLayoutDirection()); 
    tv2.setLayoutDirection(et2.getLayoutDirection()); 
    tv3.setLayoutDirection(et3.getLayoutDirection()); 
    tv4.setLayoutDirection(et4.getLayoutDirection()); 

    tv1.setGravity(et1.getGravity()); 
    tv2.setGravity(et2.getGravity()); 
    tv3.setGravity(et3.getGravity()); 
    tv4.setGravity(et4.getGravity()); 

    tv1.setText(et1.getText()); 
    tv2.setText(et2.getText()); 
    tv3.setText(et3.getText()); 
    tv4.setText(et4.getText()); 

    m2.addView(tv4,et4.getLayoutParams()); 
    m2.addView(tv3,et3.getLayoutParams()); 
    m2.addView(tv2,et2.getLayoutParams()); 
    m2.addView(tv1,et1.getLayoutParams()); 

    m3.addView(m2); 

Я не понимаю, что случилось с моим кодом, любые предложения .....

ЭТО ПОЛНЫЙ XML DATA FILE:

  <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" 
    tools:context=".MainActivity" > 
    <HorizontalScrollView 
     android:id="@+id/scrollHORIZON" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/linearLayout1" > 



     <LinearLayout 
      android:id="@+id/tileContainerME" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 

      <RelativeLayout 
      android:id="@+id/tilesAreHERE" 
      android:layout_width="207dp" 
      android:layout_height="151dp" > 

      <TextView 
       android:id="@+id/bottom1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignLeft="@+id/top1" 
       android:layout_alignParentBottom="true" 
       android:gravity="center_horizontal" 
       android:text="1" 
       /> 

      <TextView 
       android:id="@+id/left1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_centerVertical="true" 
       android:gravity="center_vertical" 
       android:text="2" 
       /> 

      <TextView 
       android:id="@+id/right1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignBaseline="@+id/left1" 
       android:layout_alignBottom="@+id/left1" 
       android:layout_alignParentRight="true" 
       android:gravity="center_vertical" 
       android:text="3" 
       /> 

      <TextView 
       android:id="@+id/top1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentTop="true" 
       android:layout_centerHorizontal="true" 
       android:gravity="center_horizontal" 
       android:text="4" 
       /> 

     </RelativeLayout>   
     </LinearLayout> 


    </HorizontalScrollView> 

</RelativeLayout> 

ответ

0

Надувание такой же схемы внутри него еще раз поможет вам в этом.

Попробуйте этот код:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 

    LinearLayout main_layout = (LinearLayout)findViewById(R.id.tileContainerME); 
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout child = (LinearLayout) inflater.inflate(R.layout.main_layout, null); 
    main_layout.addView(child, 1); 
} 

Вы получите что-то вроде этого:

enter image description here

+0

Ошибка LogCat: 01-02 11: 29: 41.976: D/errorBad (1965): android.content.res.Resources $ NotFoundException: Идентификатор ресурса # 0x7f08000a тип # 0x12 недействителен Это не работает ..... – littleHelper

+0

Почему вы назвали объект main_layout после фактического макета? Это не имеет смысла .... – littleHelper

+0

@littleHelper Это сработало для меня, и именно по этой причине я поделился снимками экрана. Вы, должно быть, допустили ошибку в своем XML-файле. Дважды проверьте их. В противном случае очистите проект, а затем попробуйте запустить его снова. – JoelFernandes

0

Вы, вероятно, получаю сообщение об ошибке сообщение, которое уже добавлено View, имеет родителя. Вам нужно будет позвонить removeView() на родителя вашего TextView или removeAllViews(), чтобы удалить их все, прежде чем добавлять их в новый RelativeLayout. Что-то вроде

m.removeAllViews(); 

m2.addView(et1); 
m2.addView(et2); 
m2.addView(et3); 
m2.addView(et4); 

Однако, если вы добавляете их несколько раз, то вы, вероятно, захотите создать новые экземпляры них, как вы делаете с вашим RelativeLayout (m2). Затем вы можете использовать params, что и у вашего оригинала TextView. Если это не ваша текущая ошибка, отправьте свой логарифм, но это приведет к исключению.

Редактировать

TextView et1 = (TextView) findViewById(R.id.top1); 
TextView et2 = (TextView) findViewById(R.id.right1); 
TextView et3 = (TextView) findViewById(R.id.left1); 
TextView et4 = (TextView) findViewById(R.id.bottom1); 

//Create the new TextViews 
TextView tv1 = new TextView(m.getContext()); //if inside Activity you can use this instead of m.getContext() 
// set params which you can get from the above TextViews 
m2.addView(tv1); 
... 
+0

Он работает, но ваш код удаляет мнения, которые были там. Я хочу сохранить их и вставить новый набор ... Так что есть два набора ... – littleHelper

+0

Правильно, поэтому я рекомендовал не делать этого таким образом. Вместо этого создайте новый 'TextViews', как вы это делаете со своим' RelativeLayout' – codeMagic

+0

См. Мое редактирование. Просто создайте новые 'TextView' и добавьте их. – codeMagic

0

Я понял это!

LinearLayout m3 = (LinearLayout)findViewById(R.id.tileContainerME); 
    RelativeLayout m = (RelativeLayout)findViewById(R.id.tilesAreHERE);  
    RelativeLayout m2 = new RelativeLayout(m.getContext()); 

    m2.setLayoutParams(m.getLayoutParams()); 


    TextView et1 = (TextView) findViewById(R.id.top1); 
    TextView et2 = (TextView) findViewById(R.id.right1); 
    TextView et3 = (TextView) findViewById(R.id.left1); 
    TextView et4 = (TextView) findViewById(R.id.bottom1); 

    TextView tv1 = new TextView(et1.getContext()); 
    TextView tv2 = new TextView(et2.getContext()); 
    TextView tv3 = new TextView(et3.getContext()); 
    TextView tv4 = new TextView(et4.getContext()); 
    tv1.setText(et1.getText()); 
    tv2.setText(et2.getText()); 
    tv3.setText(et3.getText()); 
    tv4.setText(et4.getText()); 
    tv1.setLayoutParams(et1.getLayoutParams()); 
    tv2.setLayoutParams(et2.getLayoutParams()); 
    tv3.setLayoutParams(et3.getLayoutParams()); 
    tv4.setLayoutParams(et4.getLayoutParams()); 

    m2.addView(tv1); 
    m2.addView(tv2); 
    m2.addView(tv3); 
    m2.addView(tv4); 

    m3.addView(m2); 

Это сделает копию предыдущего макета, а затем добавит его обратно в текущий макет!

+0

Я рад, что вы заработали, но это именно то, что я сказал вам сделать в своем ответе. – codeMagic

+0

Ничего, это не сработает .... Некоторые позиции отключены .... – littleHelper

0

Я точно получил это работает на этот раз! Я использовал этот код:

LinearLayout item = (LinearLayout)findViewById(R.id.tileContainerME); 
     View child = getLayoutInflater().inflate(R.layout.activity_main, null); 
     item.addView(child); 

Было бы скопировать «activity_main» класс, который хранит исключительно данные XML для плитки. Затем он копирует его в горизонтальный вид прокрутки!Вот скриншот моего решения:

http://i.stack.imgur.com/WxoJG.png

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