В приведенном ниже коде я пытаюсь отобразить базовое диалоговое окно при нажатии кнопки. В диалоговом окне показано, что нужно показать некоторый текст. У меня есть работа после того, как я наткнулся на ошибку, но у меня все еще возникает вопрос, почему эта ошибка возникает. В DialogFragmentSubclass.onCreateView() я получаю ссылку на TextView, вызывая findViewById (R.id.someIdValue). Это дает мне NullPointerException. Однако получение справки по телефону:Вызов findViewById() из подкласса DialogFragment дает 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>
Фрагмент - это всего лишь место, где хранитель для просмотра сначала нужно раздуть вид, а затем использовать его. –