Я пишу приложение в C# xamarin для Android. Этот код является универсальным и должен почти работать на Android. Таким образом, вопрос важен как для Java, так и для C#.Просмотр не найден для фрагмента при изменении ориентации
Итак, я получил это приложение, где моя MainActivity - мой оператор-фрагмент. он заменяет фрагменты следующим образом:
private void SelectItem(int position)
{
currentFragment = null;
Fragment findFrag = null;
string tag = "";
var arguments = new Bundle();
switch(position) {
case 0: // <-- Home Menu item
tag = "home";
findFrag = FragmentManager.FindFragmentByTag (tag);
if (findFrag != null) {
currentFragment = findFrag;
} else {
currentFragment = new HomeFragment();
}
break;
case 1: // <-- Picture Menu item
tag = "picture";
findFrag = FragmentManager.FindFragmentByTag (tag);
if (findFrag != null) {
currentFragment = findFrag;
} else {
currentFragment = new PictureFragment();
}
break;
case 2: // <-- Album Menu item
tag = "album";
findFrag = FragmentManager.FindFragmentByTag (tag);
if (findFrag != null) {
currentFragment = findFrag;
} else {
currentFragment = new AlbumFragment();
}
break;
case 3: // <-- Settings Menu item
tag = "settings";
findFrag = FragmentManager.FindFragmentByTag (tag);
if (findFrag != null) {
currentFragment = findFrag;
} else {
currentFragment = new SettingsFragment();
}
break;
case 4: // <-- Logout Menu item
System.Diagnostics.Debug.WriteLine ("You should be logging out");
break;
}
FragmentManager.BeginTransaction()
.Replace(Resource.Id.content_frame, currentFragment, tag)
.AddToBackStack(null)
.Commit();
_drawerList.SetItemChecked(position, true);
ActionBar.Title = _title = _menuTitles[position];
// Always close drawer when an item has been selected.
_drawer.CloseDrawer (_drawerList);
}
Все начинается хорошо, и я могу переключаться между фрагментами. Но когда я изменить ориентацию, он падает со следующим сообщением об ошибке:
No view found for id 0x7f080014 (PhotoWapp.PhotoWapp:id/content_frame) for fragment PictureFragment{b52cb3b0 #1 id=0x7f080014 picture}
[FragmentManager] Activity state:
[FragmentManager] Local Activity b52f3060 State:
[FragmentManager] mResumed=false mStopped=false mFinished=false
[FragmentManager] mLoadersStarted=false
[FragmentManager] mChangingConfigurations=false
[FragmentManager] mCurrentConfig={1.0 310mcc260mnc en_US ldltr sw320dp w533dp h294dp 240dpi nrml long land finger qwerty/v/v tball/v s.7}
[FragmentManager] Active Fragments in b52f3150:
В моих фрагментах я поставил RetainInstance = true
и, но по какой-то причине он не может найти ссылку на Resource.Id.content_frame
.. Что я должен сделать, чтобы предотвратить это от происходящего?
Макет, на который ссылается Resource.Id.content_frame, находится: Resource.Layout.Main
. И выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111" />
</android.support.v4.widget.DrawerLayout>
Вы понятия не имеете, что я имею в виду. –
Извините за пропущенную почту. Я не внимательно прочитал ваш вопрос. Один вопрос: добавляете ли вы начальный фрагмент, когда загружается ваша активность? Документация для метода замены говорит: Замените существующий фрагмент, который был добавлен в контейнер. Это по существу то же самое, что и вызов remove (Fragment) для всех добавленных в настоящее время фрагментов, которые были добавлены с тем же контейнером, и затем добавьте (int, Fragment, String) те же аргументы, которые приведены здесь. Если у вас нет Фрагмента, добавленного при воссоздании вашей активности, у вашего FrameLayout нет фрагментов для замены – Emmanuel