2013-06-21 4 views
1

Я пишу приложение в 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> 

ответ

0

Я думаю, вы должны использовать Resource.Layout.nameofxmlresource вместо Resource.Id ...

+0

Вы понятия не имеете, что я имею в виду. –

+0

Извините за пропущенную почту. Я не внимательно прочитал ваш вопрос. Один вопрос: добавляете ли вы начальный фрагмент, когда загружается ваша активность? Документация для метода замены говорит: Замените существующий фрагмент, который был добавлен в контейнер. Это по существу то же самое, что и вызов remove (Fragment) для всех добавленных в настоящее время фрагментов, которые были добавлены с тем же контейнером, и затем добавьте (int, Fragment, String) те же аргументы, которые приведены здесь. Если у вас нет Фрагмента, добавленного при воссоздании вашей активности, у вашего FrameLayout нет фрагментов для замены – Emmanuel