Android에서 동적으로 뷰를 추가 및 제거 하시겠습니까? 화면에서와 같이 Android 앱에서 s

TextView필드 오른쪽에있는 작은 아이콘을 누르면 원래 스톡 Android 연락처 화면에서와 같이 Android 앱에서 s 와 같은보기를 추가하고 제거하는 방법은 무엇 이며 a TextView와 a로 구성된 필드를 추가하거나 삭제합니다 .editTextView 무엇 볼 수 있습니다).

이를 달성하는 방법에 대한 예가 있습니까?



답변

ViewParent일반적으로 s는 뷰를 제거 ViewGroup할 수 없지만 s는 제거 할 수 있습니다. 부모를 캐스트해야합니다 ViewGroup.ViewGroup ) 당신이 원하는 것을 달성하기 위해.

예를 들면 :

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

참고 모든 것을 Layout들 수 있습니다 ViewGroup들.


답변

이 질문에서 설명한 것과 똑같은 기능이 필요합니다. 내 솔루션과 소스 코드는 다음과 같습니다. https://github.com/laoyang/android-dynamic-views . 여기에서 작동중인 비디오 데모를 볼 수 있습니다. http://www.youtube.com/watch?v=4HeqyG6FDhQ

나열한 것

기본적으로 두 개의 xml 레이아웃 파일이 있습니다.

  • , a 및 a가 있는 가로 LinearLayout 행보기TextEditSpinnerImageButton 삭제를위한 .
  • 새 추가 버튼 만있는 수직 LinearLayout 컨테이너보기 입니다 .

제어

Java 코드에서 inflate, addView, removeView 등을 사용하여 컨테이너에 행보기를 동적으로 추가 및 제거합니다. 기본 Android 앱에는 더 나은 UX를위한 가시성 제어가 있습니다. 각 행에 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);
}

답변

이것은 내 일반적인 방법입니다.

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

답변

안녕 당신은 상대적인 레이아웃을 추가하고 거기에 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);

답변

ViewGroup 클래스는 런타임에 자식 뷰 관리를위한 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);


답변

버튼 추가

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