如何在Android中添加和删除视图动态?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (66)

如何TextView从Android应用程序中添加和删​​除视图,例如在原始股票Android联系人屏幕上按下字段右侧的小图标,并添加或删除由a TextView和an editTextView

提问于
用户回答回答于

从android-developers上的这个线程中,它接触到ViewParent和ViewGroup一般不能删除视图。您需要将您的父级转换为布局(如果它是布局)才能完成您想要的任务。

例如:

//syntax error in View
View namebar = View.findViewById(R.id.namebar);
((ViewGroup) namebar.getParent()).removeView(namebar);
用户回答回答于

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

布局

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

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

控制

在Java代码中,你将使用inflate,addView,removeView等动态添加和删除行视图到容器中。你需要为每行的EditText视图添加一个TextWatcher:当文本为空时,你需要隐藏添加新按钮和删除按钮。在我的代码中,我void inflateEditRow(String)为所有逻辑编写了一个辅助函数。

其他技巧

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

源代码

主要活动的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);
}

扫码关注云+社区