setContentView проблема на Android
Мне нужна твоя помощь и, пожалуйста, не сердись на меня!
Моим первым учебным проектом было создание нового макета Android и загрузка в мой onCreate
метод
Есть код:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_layout);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.textView1, new PlaceholderFragment())
.add(R.id.editText1, new PlaceholderFragment())
.add(R.id.button1, new PlaceholderFragment())
.commit();
}
}
Дело в том, что если я прокомментирую оператор If, приложение работает отлично, но если я удалю комментарии, я не смогу запустить приложение!!
открытый статический класс PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.new_layout, container, false);
return rootView;
}
}
есть мой макет
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:ignore="HardcodedText" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textview" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
2 ответа
Похоже, вы создали новый макет с именем new_layout
, Внутри нового макета вы добавили несколько видов и пытаетесь - с условием в комментариях - добавить Fragment
в вашей деятельности. FragmentManager
попробуйте добавить новый фрагмент внутри R.id.container следующим образом:
.add(R.id.container, new PlaceholderFragment()) // add(view id, fragment class)
Тогда вы можете быть NullPointerException
потому что действие не может найти этот конкретный идентификатор в вашем макете.id container
не существует внутри new_layout
файл.
Решение
Если вы хотите использовать класс фрагментов, я бы посоветовал вам сохранить activity_main
макет для:
setContentView(R.layout.activity_main);
который содержит FrameLayout
с правильным идентификатором. Это представление будет получать и отображать фрагмент, и вы можете иметь свой собственный макет внутри него следующим образом:
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// call the custom layout here
View rootView = inflater.inflate(R.layout.new_layout, container, false);
// update, control, the views of the layout here
TextView text = (TextView) rootView.findViewById(R.id.textView1);
text.setText("This is inside fragment");
// same for other..
return rootView;
}
}
В вашем макете нет контейнера для добавления Fragment
, Добавь это FrameLayout
внутри вашего Layout
<FrameLayout
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">