У меня есть FragmentActivity, в котором размещено действие и фрагмент. Я получаю ошибку времени выполнения из-за того, что представление не создается для фрагмента до вызова onCreateView фрагмента. Трудно определить, какой вызывающий метод не может найти представление, поскольку отладчик не может найти правильные номера строк во время пошагового выполнения.
Я не могу правильно прикрепить источник, чтобы увидеть внутреннюю часть FragmentManager, поскольку, похоже, существует несоответствие между источником dl'd и .jar
Я поместил запись Log.i в StreamingActivity.onCreateView, и перед этим возникла ошибка.
Вот соответствующий LogCat:
Код: Выделить всё
07-19 10:13:36.091: I/StreamingActivity(9886): onCreate
07-19 10:13:42.271: W/dalvikvm(9886): threadid=1: thread exiting with uncaught exception (group=0x40020560)
07-19 10:13:42.281: E/AndroidRuntime(9886): FATAL EXCEPTION: main
07-19 10:13:42.281: E/AndroidRuntime(9886): java.lang.RuntimeException: Unable to start activity
ComponentInfo{kesten.fragmentstestbed/kesten.fragmentstestbed.FragmentsMainActivity}:
java.lang.IllegalArgumentException: No view found for id 0x7f05002e for fragment
StreamingActivity{4052f810 #0 id=0x7f05002e}
caused by
java.lang.IllegalArgumentException: No view found for id 0x7f05002e for fragment
StreamingActivity{40530948 #0 id=0x7f05002e}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:865)
Код: Выделить всё
public class FragmentsMainActivity extends FragmentActivity {
public final static int STARTUP_ACTIVITY_RESULT=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragments_main);
if(savedInstanceState == null) {
Intent intentStartupActivity = new Intent(this, StartupActivity.class);
if(intentStartupActivity != null)
startActivityForResult(intentStartupActivity, STARTUP_ACTIVITY_RESULT);
// get an instance of FragmentTransaction from your Activity
FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
//add a fragment
StreamingActivity streamingActivity = new StreamingActivity();
if (streamingActivity != null) {
fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
fragmentTransaction.commit();
}
}
}
Код: Выделить всё
public class StreamingActivity extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("StreamingActivity","onCreate")
}
"res/layout/main.xml"
Код: Выделить всё
Код: Выделить всё
- неправильный макет в setContentView() метода onCreate() FragmentActivity.
- идентификатор передается в FragmentTransaction .add должен быть дочерним элементом макета, указанного в setContentView.
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragments_main);
onCreateView моего фрагмента< /p>
Код: Выделить всё
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i("StreamingActivity","onCreateView");
View view = inflater.inflate(R.layout.main, container, false);
Единственное, что я могу думать о банкомате, это то, что startActivity (закрытый сторонний) вызывается после setContentView. и до того, как StreamingActivity установит для представления содержимого что-то кроме R.layout.activity_fragments_main, которое не является родительским для представления моего фрагмента.
Проблема, похоже, связана с тем, что, хотя В Activity есть setContentView, который можно вызывать в любое время, а в Fragment есть только onCreateView(), который вызывается после транзакций фрагмента, запускающих фрагмент.
Почему и что пытается получить доступ к фрагменту просмотреть до вызова onCreateView()?
darKoram
Подробнее здесь: https://stackoverflow.com/questions/115 ... iew-called