在Android中添加和删除视图dynamic?

如何从Android应用程序添加和删除视图(如TextView ,就像在原始股票Android联系人屏幕上按下字段右侧的小图标,并添加或删除由TextVieweditTextView组成的字段(从我能看到的)。

任何关于如何实现这个目标的例子?

从Android开发人员的这个线程 ,它接缝ViewParent和ViewGroup一般不能删除视图。 你需要把你的父母转换成布局(如果是布局的话)来完成你想要的东西。

例如:

 //syntax error in View View namebar = View.findViewById(R.id.namebar); ((ViewGroup) namebar.getParent()).removeView(namebar); 

我需要在这个问题中描述完全相同的function。 这里是我的解决scheme和源代码: https : //github.com/laoyang/android-dynamic-views 。 您可以在这里看到video演示: http : //www.youtube.com/watch?v = 4HeqyG6FDhQ

布局

基本上你会两个XML布局文件:

  • 带有TextEditSpinnerImageButton的水平LinearLayout 行视图 ,用于删除。
  • 一个垂直的LinearLayout 容器视图 ,只有一个Add newbutton。

控制

在Java代码中,您将使用inflate,addView,removeView等dynamic添加和删除行视图到容器中。在股票Android应用程序中,有更好的用户体验可视性控制。 您需要为每行的EditText视图添加一个TextWatcher:当文本为空时,您需要隐藏添加新button和删除button。 在我的代码中,我为所有的逻辑写了一个void inflateEditRow(String)辅助函数。

其他技巧

  • 在xml中设置android:animateLayoutChanges="true"以启用animation
  • 使用自定义透明背景与按下的select器使button在视觉上与股票Android应用程序中的相同。

源代码

主要活动的Java代码(这解释了所有的逻辑,但在xml布局文件中设置了很多属性,请参阅Github源代码以获得完整的解决scheme):

 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); } 

嗨你可以尝试通过添加相对布局,而不是添加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); 

这是我的一般方法:

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

ViewGroup类在运行时为子视图pipe理提供API,允许添加/删除视图。

其他一些关于这个问题的链接:

Android,添加新的视图没有XML布局

Android运行时布局教程

http://developer.android.com/reference/android/view/View.html

http://developer.android.com/reference/android/widget/LinearLayout.html

只要使用myView.setVisibility(View.GONE); 完全删除它。 但是,如果你想保留它的父级使用myView.setVisibility(View.INVISIBLE);

用于添加button

 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); 

用于删除button

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

嗨首先写活动类。 下面的类有一个类别的名称和小的添加button。 当你点击添加(+)button时,它会添加包含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. 一旦你完成你的观点将如下所示 在这里输入图像描述
 //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主

 <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> 

Json2View库,它是一个简单的库,可以将兼容的JSON文件转换为Android视图,以便您可以在Android应用程序中dynamic加载视图,而无需更新APK。

tellmehow

这消除了每次想要在UI中进行小的或大的更改时更新,重新编译和上传APK到Google Play的麻烦。

您可以使用json2view Android库来创builddynamicAndroid布局,如下例所示:

在这里输入图像描述

使用json2view来重新组织一个屏幕的布局

在布局之前:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:minWidth="250dp" android:text="menu 01" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:minWidth="250dp" android:text="menu 02" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:minWidth="250dp" android:text="menu 03" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:minWidth="250dp" android:text="menu 04" /> </LinearLayout> 

而你这个布局的Json将是:

  { "views": [{ "views": [], "properties": [{ "value": "wrap_content", "type": "dimen", "name": "layout_width" }, { "value": "wrap_content", "type": "dimen", "name": "layout_height" }, { "value": "center", "type": "string", "name": "layout_gravity" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "250dp", "type": "dimen", "name": "minWidth" }, { "value": "menu 01", "type": "string", "name": "text" }], "widget": "Button" }, { "views": [], "properties": [{ "value": "wrap_content", "type": "dimen", "name": "layout_width" }, { "value": "wrap_content", "type": "dimen", "name": "layout_height" }, { "value": "center", "type": "string", "name": "layout_gravity" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "250dp", "type": "dimen", "name": "minWidth" }, { "value": "menu 02", "type": "string", "name": "text" }], "widget": "Button" }, { "views": [], "properties": [{ "value": "wrap_content", "type": "dimen", "name": "layout_width" }, { "value": "wrap_content", "type": "dimen", "name": "layout_height" }, { "value": "center", "type": "string", "name": "layout_gravity" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "250dp", "type": "dimen", "name": "minWidth" }, { "value": "menu 03", "type": "string", "name": "text" }], "widget": "Button" }, { "views": [], "properties": [{ "value": "wrap_content", "type": "dimen", "name": "layout_width" }, { "value": "wrap_content", "type": "dimen", "name": "layout_height" }, { "value": "center", "type": "string", "name": "layout_gravity" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "250dp", "type": "dimen", "name": "minWidth" }, { "value": "menu 04", "type": "string", "name": "text" }], "widget": "Button" }], "properties": [{ "value": "match_parent", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "vertical", "type": "string", "name": "orientation" }], "widget": "LinearLayout" } 

而且每当你想改变你的Android布局,那么你的XML与上面的保持一样,只是需要改变服务器上的JSON文件。

 { "views": [{ "views": [{ "views": [], "properties": [{ "value": "0dp", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "menu 01", "type": "string", "name": "text" }], "widget": "Button" }, { "views": [], "properties": [{ "value": "0dp", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "menu 02", "type": "string", "name": "text" }], "widget": "Button" }], "properties": [{ "value": "match_parent", "type": "dimen", "name": "layout_width" }, { "value": "0dp", "type": "dimen", "name": "layout_height" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "horizontal", "type": "string", "name": "orientation" }], "widget": "LinearLayout" }, { "views": [{ "views": [], "properties": [{ "value": "0dp", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "menu 03", "type": "string", "name": "text" }], "widget": "Button" }, { "views": [], "properties": [{ "value": "0dp", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "10dp", "type": "dimen", "name": "layout_margin" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "menu 04", "type": "string", "name": "text" }], "widget": "Button" }], "properties": [{ "value": "match_parent", "type": "dimen", "name": "layout_width" }, { "value": "0dp", "type": "dimen", "name": "layout_height" }, { "value": "0.5", "type": "float", "name": "layout_weight" }, { "value": "horizontal", "type": "string", "name": "orientation" }], "widget": "LinearLayout" }], "properties": [{ "value": "match_parent", "type": "dimen", "name": "layout_width" }, { "value": "match_parent", "type": "dimen", "name": "layout_height" }, { "value": "vertical", "type": "string", "name": "orientation" }], "widget": "LinearLayout" }