Не получите rootLayoutContainer в фрагменте (Android 3.0 Preview)

Я сейчас вхожу в API-интерфейс фрагмента Android 3.0 Preview и создал следующую минимальную кодировку:

У меня есть Activty, которая должна вставлять фрагменты (-ы), которые в настоящее время реализованы следующим образом:

public class Cockpit extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cockpit); } public static class InfoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment ViewGroup infoFragmentRoot = (ViewGroup) getActivity().findViewById( R.id.infoFragmentRoot) ; return inflater.inflate(R.id.infoFragment, container, false); } } 

}

Соответствующая схема деятельности:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:name="test.android.ui.cockpit.Cockpit$InfoFragment" android:id="@+id/infoFragment" android:layout_weight="1" android:layout_width="10dp" android:layout_height="match_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="12dp" android:id="@+id/infoFragmentRoot" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> </fragment> 

Теперь я не понимаю, почему контейнер ViewGroup в onCreateView () во внутреннем классе InfoFragment является nullpointer, и я не понимаю, почему

 ViewGroup infoFragmentRoot = (ViewGroup) getActivity().findViewById( R.id.infoFragmentRoot) ; 

Возврат тоже null.

Спасибо за отзывы.

У вас здесь несколько проблем. Прежде всего, вы не хотите добавлять теги внутри <fragment> . Подумайте о теге фрагмента в качестве заполнителя. Метод onCreateView () фрагмента отвечает за определение иерархии представления вашего фрагмента, а не XML-файла макета. Однако вы можете создать отдельный XML-файл разметки только как макет фрагмента. Затем внутри onCreateView () вы принимаете надувной патрубок и делаете что-то вроде этого:

  View v = inflater.inflate(R.layout.frag1, container, false); TextView text1 = (TextView) v.findViewById(R.id.text1); text1.setText( myTextData ); return v; 

Обратите внимание, что параметр attach для inflate () – false? Android позаботится о возврате возвращенного представления в ваш контейнер позже.

Иерархия представлений вашей активности не гарантируется, пока фрагмент не получит обратный вызов onActivityCreated (). Таким образом, попытка получить infoFragmentRoot может вернуть значение null внутри onCreateView (). Но я даже не уверен, что происходит, когда этот тег похоронен внутри вашего <fragment> .

В этом конкретном случае, когда вы ввели тег в макет своей деятельности, обратный вызов onInflate () вашего фрагмента будет вызываться вместе с остальными атрибутами из вашего тега. Теория состоит в том, что вы можете добавить эти атрибуты в набор аргументов на свой фрагмент, а затем получить эти значения позже в onCreateView () (используя setArguments () и getArguments ()). Я говорю теоретически, потому что кажется, что в коде есть ошибка, которая обрабатывает изменение конфигурации (например, пейзаж для портрета), в результате чего onInflate () вызывается после onCreateView (), когда фрагмент восстанавливается после изменения конфигурации. См. Отчет о дефектах http://code.google.com/p/android/issues/detail?id=14796 .

На данный момент я рекомендую вам извлечь макет фрагмента в отдельный XML-файл макета (например, frag1.xml), используйте мой код выше, чтобы раздуть этот макет в onCreateView (). И не беспокойтесь о любых атрибутах, передаваемых onInflate ().

Вы также не хотите использовать onCreate для создания экземпляра вашего макета, чтобы все было обработано в родительской активности. Сохранение пакета – это все, что сделано до сих пор