【问题标题】:Add and Remove Views in Android Dynamically?在 Android 中动态添加和删除视图?
【发布时间】:2011-04-29 01:20:04
【问题描述】:

我如何在 Android 应用程序中添加和删除诸如 TextViews 之类的视图,就像在原始股票 Android 联系人屏幕上一样,您在该屏幕上按下字段右侧的一个小图标,它会添加或删除一个包含以下内容的字段TextVieweditTextView(据我所知)。

关于如何实现这一点的任何示例?

【问题讨论】:

    标签: android android-view


    【解决方案1】:

    ViewParents 通常不能删除视图,但 ViewGroups 可以。您需要将您的父母转换为ViewGroup(如果它是ViewGroup)来完成您想要的。

    例如:

    View namebar = View.findViewById(R.id.namebar);
    ((ViewGroup) namebar.getParent()).removeView(namebar);
    

    请注意,所有Layouts 都是ViewGroups。

    【讨论】:

    【解决方案2】:

    我需要这个问题中描述的完全相同的功能。这是我的解决方案和源代码:https://github.com/laoyang/android-dynamic-views。您可以在此处观看视频演示:http://www.youtube.com/watch?v=4HeqyG6FDhQ

    布局

    基本上你会得到两个 xml 布局文件:

    • 水平 LinearLayout 行视图,带有 TextEditSpinnerImageButton 用于删除。
    • 只有一个添加新按钮的垂直LinearLayout 容器视图

    控制

    在 Java 代码中,您将使用 inflate、addView、removeView 等动态地将行视图添加和删除到容器中。在现有的 Android 应用程序中,有一些可见性控制可以提供更好的用户体验。您需要在每一行中为 EditText 视图添加一个 TextWatcher:当文本为空时,您需要隐藏 Add new 按钮和删除按钮。在我的代码中,我为所有逻辑编写了一个 void inflateEditRow(String) 辅助函数。

    其他技巧

    • 在 xml 中设置 android:animateLayoutChanges="true" 以启用动画
    • 使用带有 pressed 选择器的自定义透明背景,使按钮在视觉上与普通 Android 应用中的按钮相同。

    源代码

    主Activity的Java代码(这解释了所有的逻辑,但是在xml布局文件中设置了相当多的属性,完整的解决方案请参考Github源码):

    public class MainActivity extends Activity {
    // Parent view for all rows and the add button.
    private LinearLayout mContainerView;
    // The "Add new" button
    private Button mAddButton;
    // There always should be only one empty row, other empty rows will
    // be removed.
    private View mExclusiveEmptyView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.row_container);
        mContainerView = (LinearLayout) findViewById(R.id.parentView);
        mAddButton = (Button) findViewById(R.id.btnAddNewItem);
    
        // Add some examples
        inflateEditRow("Xiaochao");
        inflateEditRow("Yang");
    }
    
    // onClick handler for the "Add new" button;
    public void onAddNewClicked(View v) {
        // Inflate a new row and hide the button self.
        inflateEditRow(null);
        v.setVisibility(View.GONE);
    }
    
    // onClick handler for the "X" button of each row
    public void onDeleteClicked(View v) {
        // remove the row by calling the getParent on button
        mContainerView.removeView((View) v.getParent());
    }
    
    // Helper for inflating a row
    private void inflateEditRow(String name) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rowView = inflater.inflate(R.layout.row, null);
        final ImageButton deleteButton = (ImageButton) rowView
                .findViewById(R.id.buttonDelete);
        final EditText editText = (EditText) rowView
                .findViewById(R.id.editText);
        if (name != null && !name.isEmpty()) {
            editText.setText(name);
        } else {
            mExclusiveEmptyView = rowView;
            deleteButton.setVisibility(View.INVISIBLE);
        }
    
        // A TextWatcher to control the visibility of the "Add new" button and
        // handle the exclusive empty view.
        editText.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void afterTextChanged(Editable s) {
    
                // Some visibility logic control here:
                if (s.toString().isEmpty()) {
                    mAddButton.setVisibility(View.GONE);
                    deleteButton.setVisibility(View.INVISIBLE);
                    if (mExclusiveEmptyView != null
                            && mExclusiveEmptyView != rowView) {
                        mContainerView.removeView(mExclusiveEmptyView);
                    }
                    mExclusiveEmptyView = rowView;
                } else {
                    if (mExclusiveEmptyView == rowView) {
                        mExclusiveEmptyView = null;
                    }
                    mAddButton.setVisibility(View.VISIBLE);
                    deleteButton.setVisibility(View.VISIBLE);
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }
        });
    
        // Inflate at the end of all rows but before the "Add new" button
        mContainerView.addView(rowView, mContainerView.getChildCount() - 1);
    }
    

    【讨论】:

    • 正在研究类似于 SO 的东西,效果很好
    • 根据我的屏幕高度,我可以添加 7 个条目,之后“添加新”按钮不可见,它隐藏在软键盘下方。要单击“添加新”,我必须隐藏键盘并单击“添加新”按钮以添加更多条目。 12 个条目后,“添加新”按钮隐藏在屏幕下方,!Valid XHTML
    【解决方案3】:

    这是我的一般方式:

    View namebar = view.findViewById(R.id.namebar);
    ViewGroup parent = (ViewGroup) namebar.getParent();
    if (parent != null) {
        parent.removeView(namebar);
    }
    

    【讨论】:

      【解决方案4】:

      嗨,您可以通过添加相对布局来尝试这种方式,而不是在其中添加 textview。

      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                  (LayoutParams.WRAP_CONTENT), (LayoutParams.WRAP_CONTENT));
      
      RelativeLayout relative = new RelativeLayout(getApplicationContext());
      relative.setLayoutParams(lp);
      
      TextView tv = new TextView(getApplicationContext());
      tv.setLayoutParams(lp);
      
      EditText edittv = new EditText(getApplicationContext());
      edittv.setLayoutParams(lp);
      
      relative.addView(tv);
      relative.addView(edittv);
      

      【讨论】:

      • 是否会在不重新加载整个屏幕的情况下自动向布局添加新视图?很像你如何在联系人中添加新的文本字段?
      • Android 必须在添加新视图时重新绘制屏幕(我认为)。但在大多数情况下它不应该影响你
      • 关于如何从线性布局中删除特定视图的任何示例?
      • 由于不包括如何删除视图的示例而被否决。
      • 为了从 LinearLayout 中删除视图,这就是我所做的。 MyLinearLayoutThatHoldsOtherViews.removeAllViews(); removeAllViews() 是关键。希望它有所帮助并且有意义。 ^.^
      【解决方案5】:

      只需使用myView.setVisibility(View.GONE); 将其完全删除。 但是,如果您想保留其父级中的占用空间,请使用myView.setVisibility(View.INVISIBLE);

      【讨论】:

      • 它不是删除只是隐藏。
      • 是的,但 View.GONE 完全像删除一样,因为保留的空间不再显示。
      • 优秀的帖子,解决了我的问题。如果您的视图已经在 xml 中创建并且您只是想显示或隐藏它们并让其他视图占据那些隐藏视图应该所在的空间,我相信这是正确的答案。
      • 请记住View.INVISIBLE 只隐藏视图。 OnClickListener(如果已设置)在用户触摸视图存在(但不可见)的 区域 时仍会响应用户。因此,在这种情况下,您最好也删除OnClickListeners
      【解决方案6】:

      【讨论】:

      • ViewGroup 及其方法都提供 API(而不是一组库),但只是一些处理您所说的行为(例如添加和删除视图)的方法。这些方法不仅仅是在运行时管理视图,而是管理它们的独特方式。当您编写 XML 布局时,它只是在 Java 中解析,并在运行时基于它创建视图!
      【解决方案7】:

      用于添加按钮

      LinearLayout dynamicview = (LinearLayout)findViewById(R.id.buttonlayout);
      LinearLayout.LayoutParams  lprams = new LinearLayout.LayoutParams(  LinearLayout.LayoutParams.WRAP_CONTENT,
      LinearLayout.LayoutParams.WRAP_CONTENT);
      
      Button btn = new Button(this);
      btn.setId(count);
      final int id_ = btn.getId();
      btn.setText("Capture Image" + id_);
      btn.setTextColor(Color.WHITE);
      btn.setBackgroundColor(Color.rgb(70, 80, 90));
      dynamicview.addView(btn, lprams);
      btn = ((Button) findViewById(id_));
      btn.setOnClickListener(this);
      

      用于移除按钮

      ViewGroup layout = (ViewGroup) findViewById(R.id.buttonlayout);
      View command = layout.findViewById(count);
      layout.removeView(command);
      

      【讨论】:

      • count 只不过是动态创建的按钮的 id
      【解决方案8】:

      你好首先编写Activity类。以下类具有类别名称和小添加按钮。当您按下添加 (+) 按钮时,它会添加包含 EditText 和执行删除行的 ImageButton 的新行。

      package com.blmsr.manager;
      
      import android.app.Activity;
      import android.app.ListActivity;
      import android.content.Intent;
      import android.graphics.Color;
      import android.graphics.drawable.Drawable;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.Menu;
      import android.view.MenuItem;
      import android.view.View;
      import android.widget.Button;
      import android.widget.EditText;
      import android.widget.ImageButton;
      import android.widget.LinearLayout;
      import android.widget.ScrollView;
      import android.widget.TableLayout;
      import android.widget.TableRow;
      import android.widget.TextView;
      
      import com.blmsr.manager.R;
      import com.blmsr.manager.dao.CategoryService;
      import com.blmsr.manager.models.CategoryModel;
      import com.blmsr.manager.service.DatabaseService;
      
      public class CategoryEditorActivity extends Activity {
          private final String CLASSNAME = "CategoryEditorActivity";
          LinearLayout itsLinearLayout;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_category_editor);
      
              itsLinearLayout = (LinearLayout)findViewById(R.id.linearLayout2);
          }
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.menu_category_editor, menu);
          return true;
      }
      
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          switch (item.getItemId()) {
              case R.id.action_delete:
                  deleteCategory();
                  return true;
              case R.id.action_save:
                  saveCategory();
                  return true;
              case R.id.action_settings:
                  return true;
              default:
                  return super.onOptionsItemSelected(item);
          }
      }
      
      /**
       * Adds a new row which contains the EditText and a delete button.
       * @param theView
       */
      public void addField(View theView)
      {
          itsLinearLayout.addView(tableLayout(), itsLinearLayout.getChildCount()-1);
      }
      
      // Using a TableLayout as it provides you with a neat ordering structure
      
      private TableLayout tableLayout() {
          TableLayout tableLayout = new TableLayout(this);
          tableLayout.addView(createRowView());
          return tableLayout;
      }
      
      private TableRow createRowView() {
          TableRow tableRow = new TableRow(this);
          tableRow.setPadding(0, 10, 0, 0);
      
          EditText editText = new EditText(this);
          editText.setWidth(600);
          editText.requestFocus();
      
          tableRow.addView(editText);
          ImageButton btnGreen = new ImageButton(this);
          btnGreen.setImageResource(R.drawable.ic_delete);
          btnGreen.setBackgroundColor(Color.TRANSPARENT);
          btnGreen.setOnClickListener(anImageButtonListener);
          tableRow.addView(btnGreen);
      
          return tableRow;
      }
      
      /**
       * Delete the row when clicked on the remove button.
       */
      private View.OnClickListener anImageButtonListener = new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              TableRow anTableRow = (TableRow)v.getParent();
              TableLayout anTable = (TableLayout) anTableRow.getParent();
              itsLinearLayout.removeView(anTable);
      
          }
      };
      
      /**
       * Save the values to db.
       */
      private void saveCategory()
      {
          CategoryService aCategoryService = DatabaseService.getInstance(this).getCategoryService();
          aCategoryService.save(getModel());
          Log.d(CLASSNAME, "successfully saved model");
      
          Intent anIntent = new Intent(this, CategoriesListActivity.class);
          startActivity(anIntent);
      
      }
      
      /**
       * performs the delete.
       */
      private void deleteCategory()
      {
      
      }
      
      /**
       * Returns the model object. It gets the values from the EditText views and sets to the model.
       * @return
       */
      private CategoryModel getModel()
      {
          CategoryModel aCategoryModel = new CategoryModel();
          try
          {
              EditText anCategoryNameEditText = (EditText) findViewById(R.id.categoryNameEditText);
              aCategoryModel.setCategoryName(anCategoryNameEditText.getText().toString());
              for(int i= 0; i< itsLinearLayout.getChildCount(); i++)
              {
                  View aTableLayOutView = itsLinearLayout.getChildAt(i);
                  if(aTableLayOutView instanceof  TableLayout)
                  {
                      for(int j= 0; j< ((TableLayout) aTableLayOutView).getChildCount() ; j++ );
                      {
                          TableRow anTableRow = (TableRow) ((TableLayout) aTableLayOutView).getChildAt(i);
                          EditText anEditText =  (EditText) anTableRow.getChildAt(0);
                          if(StringUtils.isNullOrEmpty(anEditText.getText().toString()))
                          {
                              // show a validation message.
                              //return aCategoryModel;
                          }
      
                          setValuesToModel(aCategoryModel, i + 1, anEditText.getText().toString());
                      }
                  }
              }
          }
          catch (Exception anException)
          {
              Log.d(CLASSNAME, "Exception occured"+anException);
          }
      
          return aCategoryModel;
      }
      
      /**
       * Sets the value to model.
       * @param theModel
       * @param theFieldIndexNumber
       * @param theFieldValue
       */
      private void setValuesToModel(CategoryModel theModel, int theFieldIndexNumber, String theFieldValue)
      {
          switch (theFieldIndexNumber)
          {
              case 1 :
                  theModel.setField1(theFieldValue);
                  break;
              case 2 :
                  theModel.setField2(theFieldValue);
                  break;
              case 3 :
                  theModel.setField3(theFieldValue);
                  break;
              case 4 :
                  theModel.setField4(theFieldValue);
                  break;
              case 5 :
                  theModel.setField5(theFieldValue);
                  break;
              case 6 :
                  theModel.setField6(theFieldValue);
                  break;
              case 7 :
                  theModel.setField7(theFieldValue);
                  break;
              case 8 :
                  theModel.setField8(theFieldValue);
                  break;
              case 9 :
                  theModel.setField9(theFieldValue);
                  break;
              case 10 :
                  theModel.setField10(theFieldValue);
                  break;
              case 11 :
                  theModel.setField11(theFieldValue);
                  break;
              case 12 :
                  theModel.setField12(theFieldValue);
                  break;
              case 13 :
                  theModel.setField13(theFieldValue);
                  break;
              case 14 :
                  theModel.setField14(theFieldValue);
                  break;
              case 15 :
                  theModel.setField15(theFieldValue);
                  break;
          }
      }
      }
      

      2。编写如下所示的 Layout xml。

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical"
      android:background="#006699"
      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="com.blmsr.manager.CategoryEditorActivity">
      
      <LinearLayout
          android:id="@+id/addCategiryNameItem"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:orientation="horizontal">
      
          <TextView
              android:id="@+id/categoryNameTextView"
              android:layout_width="200dp"
              android:layout_height="wrap_content"
              android:text="@string/lbl_category_name"
              android:textStyle="bold"
              />
      
          <TextView
              android:id="@+id/categoryIconName"
              android:layout_width="100dp"
              android:layout_height="wrap_content"
              android:text="@string/lbl_category_icon_name"
              android:textStyle="bold"
              />
      
      </LinearLayout>
      
      <LinearLayout
          android:id="@+id/linearLayout1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">
      
          <EditText
              android:id="@+id/categoryNameEditText"
              android:layout_width="200dp"
              android:layout_height="wrap_content"
              android:hint="@string/lbl_category_name"
              android:inputType="textAutoComplete" />
      
      
          <ScrollView
              android:id="@+id/scrollView1"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
      
              <LinearLayout
                  android:id="@+id/linearLayout2"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:orientation="vertical">
      
              <LinearLayout
                  android:id="@+id/linearLayout3"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:orientation="horizontal">
      
      
                  </LinearLayout>
      
                  <ImageButton
                      android:id="@+id/addField"
                      android:layout_width="50dp"
                      android:layout_height="50dp"
                      android:layout_below="@+id/addCategoryLayout"
                      android:src="@drawable/ic_input_add"
                      android:onClick="addField"
                      />
              </LinearLayout>
          </ScrollView>
      </LinearLayout>
      

      1. 完成后,您的视图将如下所示

      【讨论】:

        【解决方案9】:

        Kotlin 扩展解决方案

        添加removeSelf 以直接调用视图。如果附加到父级,它将被删除。这使您的代码更具声明性,因此更具可读性。

        myView.removeSelf()
        
        fun View?.removeSelf() {
            this ?: return
            val parent = parent as? ViewGroup ?: return
            parent.removeView(this)
        }
        

        这里有 3 个选项,说明如何以编程方式将视图添加到 ViewGroup

        // Built-in
        myViewGroup.addView(myView)
        
        // Reverse addition
        myView.addTo(myViewGroup)
        
        fun View?.addTo(parent: ViewGroup?) {
            this ?: return
            parent ?: return
            parent.addView(this)
        }
        
        // Null-safe extension
        fun ViewGroup?.addView(view: View?) {
            this ?: return
            view ?: return
            addView(view)
        }
        

        【讨论】:

          【解决方案10】:
          //MainActivity :
          
          
          
          
          
           package com.edittext.demo;
              import android.app.Activity;
              import android.os.Bundle;
              import android.text.TextUtils;
              import android.view.Menu;
              import android.view.View;
              import android.view.View.OnClickListener;
              import android.widget.Button;
              import android.widget.EditText;
              import android.widget.LinearLayout;
              import android.widget.Toast;
          
              public class MainActivity extends Activity {
          
                  private EditText edtText;
                  private LinearLayout LinearMain;
                  private Button btnAdd, btnClear;
                  private int no;
          
                  @Override
                  protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.activity_main);
          
                      edtText = (EditText)findViewById(R.id.edtMain);
                      btnAdd = (Button)findViewById(R.id.btnAdd);
                      btnClear = (Button)findViewById(R.id.btnClear);
                      LinearMain = (LinearLayout)findViewById(R.id.LinearMain);
          
                      btnAdd.setOnClickListener(new OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              if (!TextUtils.isEmpty(edtText.getText().toString().trim())) {
                                  no = Integer.parseInt(edtText.getText().toString());
                                  CreateEdittext();
                              }else {
                                  Toast.makeText(MainActivity.this, "Please entere value", Toast.LENGTH_SHORT).show();
                              }
                          }
                      });
          
                      btnClear.setOnClickListener(new OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              LinearMain.removeAllViews();
                              edtText.setText("");
                          }
                      });
          
                      /*edtText.addTextChangedListener(new TextWatcher() {
                          @Override
                          public void onTextChanged(CharSequence s, int start, int before, int count) {
          
                          }
                          @Override
                          public void beforeTextChanged(CharSequence s, int start, int count,int after) {
                          }
                          @Override
                          public void afterTextChanged(Editable s) {
                          }
                      });*/
          
                  }
          
                  protected void CreateEdittext() {
                      final EditText[] text = new EditText[no];
                      final Button[] add = new Button[no];
                      final LinearLayout[] LinearChild = new LinearLayout[no];
                      LinearMain.removeAllViews();
          
                      for (int i = 0; i < no; i++){
          
                          View view = getLayoutInflater().inflate(R.layout.edit_text, LinearMain,false);
                          text[i] = (EditText)view.findViewById(R.id.edtText);
                          text[i].setId(i);
                          text[i].setTag(""+i);
          
                          add[i] = (Button)view.findViewById(R.id.btnAdd);
                          add[i].setId(i);
                          add[i].setTag(""+i);
          
                          LinearChild[i] = (LinearLayout)view.findViewById(R.id.child_linear);
                          LinearChild[i].setId(i);
                          LinearChild[i].setTag(""+i);
          
                          LinearMain.addView(view);
          
                          add[i].setOnClickListener(new View.OnClickListener() {
                              public void onClick(View v) {
                                  //Toast.makeText(MainActivity.this, "add text "+v.getTag(), Toast.LENGTH_SHORT).show();
                                  int a = Integer.parseInt(text[v.getId()].getText().toString());
                                  LinearChild[v.getId()].removeAllViews();
                                  for (int k = 0; k < a; k++){
          
                                      EditText text = (EditText) new EditText(MainActivity.this);
                                      text.setId(k);
                                      text.setTag(""+k);
          
                                      LinearChild[v.getId()].addView(text);
                                  }
                              }
                          });
                      }
                  }
          
                  @Override
                  public boolean onCreateOptionsMenu(Menu menu) {
                      // Inflate the menu; this adds items to the action bar if it is present.
                      getMenuInflater().inflate(R.menu.main, menu);
                      return true;
                  }
          
              }
          

          // 现在添加xml main

          <LinearLayout 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:orientation="vertical"
          tools:context=".MainActivity" >
          
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="10dp"
              android:orientation="horizontal" >
          
              <EditText
                  android:id="@+id/edtMain"
                  android:layout_width="0dp"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="20dp"
                  android:layout_weight="1"
                  android:ems="10"
                  android:hint="Enter value" >
          
                  <requestFocus />
              </EditText>
          
              <Button
                  android:id="@+id/btnAdd"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="10dp"
                  android:text="Add" />
          
              <Button
                  android:id="@+id/btnClear"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="5dp"
                  android:layout_marginRight="5dp"
                  android:text="Clear" />
          </LinearLayout>
          
          <ScrollView
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_margin="10dp" >
          
              <LinearLayout
                  android:id="@+id/LinearMain"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
              </LinearLayout>
          </ScrollView>
          

          // 现在添加视图 xml 文件..

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical" >
          
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="10dp"
              android:orientation="horizontal" >
          
              <EditText
                  android:id="@+id/edtText"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="20dp"
                  android:ems="10" />
          
              <Button
                  android:id="@+id/btnAdd"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="10dp"
                  android:text="Add" />
          </LinearLayout>
          
          <LinearLayout
              android:id="@+id/child_linear"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginLeft="30dp"
              android:layout_marginRight="10dp"
              android:layout_marginTop="5dp"
              android:orientation="vertical" >
          </LinearLayout>
          

          【讨论】:

            猜你喜欢
            • 2012-11-19
            • 1970-01-01
            • 1970-01-01
            • 2011-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-09
            相关资源
            最近更新 更多