2014-03-25 3 views
1

나는이 주제가 새로운 것이 아니라는 것을 알고 있지만, 실제로 이것으로 붙어서 많은 답을 시도했지만 여전히 쓰고 사용해야하는 내용을 분명히 할 수는 없다.프로그래밍 방식으로보기를 올바르게 추가하는 방법은 무엇입니까?

나는 내가 프로그래밍 방식으로 추가 할 TextView passdel이이 레이아웃 파일 Settings.XML의

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    ... 

    <TextView 
     android:id="@+id/pass" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="7dp" 
     android:layout_marginTop="10dp" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/pass_del" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dp" 
     android:layout_marginLeft="7dp" 
     android:layout_marginTop="7dp" 
     android:text="Удалить пароль" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
    ... 
</LinearLayout> 

있습니다. 그 onCreate 설명 passdel=(TextView) findViewById(R.id.pass_del);

내가

public void onPasSet() { 
     pass.setText("Сменить пароль"); 
     ((LinearLayout)passdel.getParent()).addView(passdel); 
    } 
    public void onPasDel() { 
     pass.setText("Установить пароль"); 
     ((LinearLayout)passdel.getParent()).removeView(passdel); 
    } 

onPasDel

가 잘 작동 이러한 방법이있다. Java가 현재 레이아웃을 사용하는 것 같습니다. 따라서 View을 제거하면이 레이아웃에 표시됩니다. 그리고이 View을 추가하려고하면 Java가 현재 레이아웃에서이 뷰를 찾으려고 시도하지만 제거되었으므로 ..nullpointerexception. addView 모든 내용을 올바르게 작성하려면 어떻게해야합니까? 필요한 레이아웃을 가리키는 방법은 무엇입니까?

+1

다음에 전화를 걸면 어떻게됩니까? ((LinearLayout) passdel.getParent()). addView (passdel); 어딘가에'passdel'을 추가한다면 아마 부모가 없기 때문에'getParent'는 null 이외의 것을 반환 할 수 없습니다. 레이아웃을 직접 참조해야합니다. – njzk2

답변

2

왜 제거해야합니까 /이 View을 추가? 내가 제대로이 구성 요소의 목표를 이해하면, 가장 좋은 방법은 보여/단지 숨길 수있을 것입니다 : 물론

passdel.setVisibility(View.GONE); 
passdel.setVisibility(View.VISIBLE); 

, 당신은 ViewGroup에서 passdel을 삭제 한 후에는 '당신 때문에 더 이상 어떤 부모가 없습니다 NPEonPasDel()

+0

setVisibility를 사용하지 않기로 결정했습니다. 내보기를 보이지 않게 만들고,이보기의 빈 공간 만 비워두기 때문입니다. 이 빈 공간을 제거하는 방법을 찾지 못했기 때문에 동적으로보기를 제거하고 추가하는 것이 나에게 가장 좋은 방법이었습니다. P.S 나는 초보자이다. – anindis

+1

@anindis 아니요,'View.GONE'의 문서 설명에서 :이보기는 보이지 않으며, ** 레이아웃 용도로 공간을 차지하지 않습니다. ** – nikis

+0

oh. 고맙습니다. 어떻게 든 나는 사라져 버리지 않았다. 눈에 보이지도 보이지 않는 곳이 있다고 생각합니다. 그리고 나는 네가 GONE을 쓰는 것을 눈치 채지 못했다. 죄송합니다. 부끄러운 줄 알아라. – anindis

0

제안한대로 getParent()은 작동하지 않습니다. TextView은 인스턴스화되지 않았습니다. 다른 방법으로 레이아웃을 가져와야합니다. findViewById(R.id.layout.id)으로 해결할 수 있습니다.

예 : XML에서 :

<LinearLayout 
... 
android:id="@+id/my_layout"> 
... 

활동 :

LinearLayout ll = (LinearLayout) findViewById(R.id.my_layout); 
ll.addView(myView); 
+0

예, 작동합니다. 고맙습니다. 이제는 분명합니다. – anindis

관련 문제