1

아래 코드에서 버튼 클릭시 기본 대화 상자를 표시하려고합니다. 대화 상자에는 텍스트를 표시해야하는 몇 가지 필요가 표시됩니다. 내가 오류가 발생했을 때 나는 그것을 가지고있어,하지만 난 아직도 그 오류가 발생하는 질문에있어. DialogFragmentSubclass.onCreateView()에서 findViewById (R.id.someIdValue)를 호출하여 TextView에 대한 참조를 얻습니다. 이것은 나에게 NullPointerException을 준다. 그러나 전화로 참조를 얻는 것 :DialogFragment 서브 클래스에서 findViewById()를 호출하면 NullPointerException이 발생합니다.

View v = inflate.inflate(someREsourceValue, container, fals); 
TextView tv = (TextView) v.findViewById(R.id.someValue); 

것 같습니다. 왜이 기능이 작동하고 다른 하나는 NullPointerException을 발생시킵니다. 여기

public class MainActivity extends Activity { 
    DownloadImageDialogFragment myDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_layout); 

     // get reference to buttons 
     Button buttonDownloadImage = (Button) findViewById(R.id.downloadImage); 
     buttonDownloadImage.setText("Download new Image"); 

     // upon button click, show a Dialog 
     buttonDownloadImage.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 

       myDialog = new DownloadImageDialogFragment(); 
       myDialog.show(ft, null);    
      } 
     }); 

    } 

    private class DownloadImageDialogFragment extends DialogFragment {    
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

       View v = inflater.inflate(R.layout.fragment_dialog, container, false); 
       // TextView tv = findViewById(R.id.dialogTextView); // this gives an error 
       TextView tv = (TextView) v.findViewById(R.id.dialogTextView); // this works 
       tv.setText("This is my dialog"); 
       return v; 
      } 
     } 
} 

과을 (전체 코드는 아래를 참조), 대화 상자의 레이아웃 파일 :

<TextView 
     android:id="@+id/dialogTextView" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" /> 

</LinearLayout> 
+0

조각은보기를위한 장소 홀더입니다. 먼저보기를 부 풀린 다음 사용하십시오. –

답변

1

당신이 findViewById()을 요구하고있다, 당신은 당신의 Activity의 내부 클래스에서 그렇게하고있다, 이 방법은이 방법이 나오는 곳입니다. 해당 뷰 ID는 액티비티의 레이아웃에 존재하지 않으므로 null이 반환됩니다. 대화 상자 조각은 정의 된보기를 가져 오기 전에 발견 한대로 레이아웃을 확장해야합니다.

+0

명확한 설명에 감사드립니다. 그것은 많은 의미가 있습니다! 나는 내부 수업에 대해 완전히 잊어 버렸다! – Minq

0

이렇게 설명하려면 실제로보기가 무엇인지 이해해야합니다. 안드로이드 website 도면에 따르면

,

화면에서 사각형 영역을 점유하고 드로잉 및 이벤트 처리를 담당한다. 보기는 대화 형 UI 구성 요소 (단추, 텍스트 필드 등)를 만드는 데 사용되는 위젯의 기본 클래스입니다. ViewGroup 서브 클래스는 다른 뷰 (또는 다른 ViewGroups)를 보유하고 레이아웃 속성을 정의하는 보이지 않는 컨테이너 인 레이아웃의 기본 클래스입니다.

본질적으로 클래스입니다. Object (Java 기본 클래스)를 확장하고 Drawable.Callback KeyEvent.Callback AccessibilityEventSource을 구현합니다. JAVA에 익숙하다면 this을 읽고 implementsextends을 이해하십시오.

이제 findViewById(...) 함수에 대해 읽으면 함수가 View 개체를 반환합니다. 이것은 이 아니며 인 Textview 개체입니다. 따라서 코드 기반을 만들기 위해 몇 가지 추가 단계를 수행해야한다는 것을 알고 있어야합니다.

이제 더 자세히 살펴보고 TextView Android 페이지를 읽으면 View 클래스가 확장 된 것을 볼 수 있습니다. 그래서 그것은 그 클래스의 모든 것을 상속받습니다. 이것은 기본적으로 findViewById(int id) 함수에 의해 반환 된 뷰에 "형식"을 전달해야하는 이유입니다.

마지막으로 그것은 어디에서 함수를 호출하는지에 관한 것입니다. 보기가 정의되지 않은 활동 레이아웃에서 함수를 호출하면 수행 한 것처럼 NULL 포인터 예외가 발생합니다. 나는이 경우 자신의 xml을 가지고 있고 textview가 정의되어 있지 않은 하위 액티비티에서 함수를 호출한다고 생각한다. 그러므로 당신은 그것을 가진보기를 팽창시켜야합니다. TextView 태그를 추가하면 태그가 추가됩니다.

+0

설명해 주셔서 감사합니다.귀하의 회신에서 다음 문장은 내가 모르는 것입니다 : "마지막으로 그것은 당신이 당신의 기능을 호출하는 곳입니다. 당신이보기를 정의하지 않은 활동 레이아웃으로부터 당신의 기능을 호출한다면 당신은 NULL을 얻을 것입니다. 당신이했던 것처럼 포인터 예외. " 그것은 지금 의미가 있으며 나는 그것을 더 잘 이해합니다. Thnx! – Minq

관련 문제