2

Я пытаюсь реализовать PreferenceFragment для загрузки из AppCompatActivity (или обычной деятельности), и я, похоже, включил его в метод onCreate фрагмента предпочтения, но экран отображается пустым. Ниже изображение:Android PreferenceFragment загружен без ошибок, но экран пуст

У меня есть ощущение, что фрагмент ЗАГРУЗКА за макетом, но я понятия не имею, как это проверить, так как я получаю подобное поведение, даже если я запускаю его на пустой Макет действий с одним FrameLayout. Я пытаюсь отобразить страницу настроек из моей основной, используя onOptionSelected().

Я застрял на этом как неделя, и ни один из ответов, которые я нахожу, не помогает, любая помощь будет очень высоко оценена!

Вот мой код активность:

public class genericActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(Main.appTAG, "onCreate: settings activity"); 
    setContentView(R.layout.activity_generic); 
    // IF intent message == settings 
    final Fragment settingsFragment = new SettingsFragment(); 
    getFragmentManager() 
      .beginTransaction() 
      .replace(R.id.fragmentParent, settingsFragment) 
      .addToBackStack(null) 
      .commit(); 
    getFragmentManager().addOnBackStackChangedListener(
      new FragmentManager.OnBackStackChangedListener() { 
       @Override 
       public void onBackStackChanged() { 
        getFragmentManager() 
          .beginTransaction() 
          .remove(settingsFragment) 
          .commit(); 
       } 
      }); 

    } 

} 

Макет для деятельности, т.е. activity_generic.xml следующим

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="com.thesis.deefunkt.thesispractise.genericActivity"> 


<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 



</android.support.design.widget.AppBarLayout> 


<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:id="@+id/fragmentParent" 
    android:fitsSystemWindows="true"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@android:id/list"> 

    </ListView> 

</LinearLayout> 

</android.support.design.widget.CoordinatorLayout> 

Мне не нужна совместимость имеется на самом деле, так как все этот экран выполняет настройки, но сохранил его для последовательного просмотра.

Мой код SettingsFragment выглядит следующим образом:

public class SettingsFragment extends PreferenceFragment { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.pref_general); 
    Log.d(Main.appTAG, "onCreate: SettingsFragment "); 
} 

} 

В то время как это работает, у меня есть куча записей журнала, которые я не знаю, как интерпретировать:

D/com.deefunkt.UsbComms: onCreate: settings activity 
D/PhoneWindow: *FMB* installDecor mIsFloating : false 
D/PhoneWindow: *FMB* installDecor flags : -2139029248 
D/AbsListView: Get MotionRecognitionManager 
D/Activity: performCreate Call Injection manager 
W/Resources: Converting to string: TypedValue{t=0x10/d=0x2580 a=-1} 
W/Resources: Converting to string: TypedValue{t=0x10/d=0x8 a=-1} 
W/Resources: Converting to string: TypedValue{t=0x10/d=0x1 a=-1} 
W/Resources: Converting to string: TypedValue{t=0x10/d=0x0 a=-1} 


D/com.deefunkt.UsbComms: onCreate: SettingsFragment 
I/InjectionManager: dispatchPreferences > Target : com.thesis.deefunkt.thesispractise.SettingsFragment 
D/AbsListView: Get MotionRecognitionManager 
I/InjectionManager: dispatchOnViewCreated > Target : com.thesis.deefunkt.thesispractise.SettingsFragment isFragment :true 
I/InjectionManager: dispatchOnViewCreated > Target : com.thesis.deefunkt.thesispractise.genericActivity isFragment :false 
D/SecWifiDisplayUtil: Metadata value : SecSettings2 
D/PhoneWindow: *FMB* isFloatingMenuEnabled mFloatingMenuBtn : null 
D/PhoneWindow: *FMB* isFloatingMenuEnabled return false 
D/SRIB_DCS: log_dcs ThreadedRenderer::initialize entered! 
D/mali_winsys: new_window_surface returns 0x3000, [1440x2560]-format:1 
D/OpenGLRenderer: endAllStagingAnimators on 0x7f65c06600 (RippleDrawable) with handle 0x7f74cff540 

Как вы можете видеть , вызывается метод onCreate внутри фрагмента, но я не знаю, что делать с данными журнала.

Заранее благодарен!

+0

Используйте FrameLayout для раздувания фрагмента, а не корневой компоновки Activity. Кроме того, используйте [PreferenceFragmentCompat] (http://developer.android.com/reference/android/support/v7/preference/PreferenceFragmentCompat.html), так как вы используете AppCompatActivity –

+0

Извините, вы говорите, что вместо использования LinearLayout , Я должен использовать FrameLayout (но внутри activity_generic.xml), или мне нужно создать новый XML-файл с одним FrameLayout внутри него? Я думал, так как мы определили объект предпочтения, содержащий xml-файл, который использует макет, который использует фрагмент, и мы просто передаем ему контейнер для его ввода? – deefunkt

+0

Вам придется реорганизовать свой код ... Если вы используете Фрагменты, то в макете активности контент не должен идти, а вместо содержимого помещается FrameLayout, где Fragments раздуты http://developer.android. ком/обучение/основы/фрагменты/фрагмент ui.html # AddAtRuntime –

ответ

0

Хорошо, поэтому, потратив все это время на это, мне наконец удалось исправить ошибку, но я не знаю почему. Мое предположение, что

getFragmentManager() 
     .beginTransaction() 
     .replace(R.id.fragmentParent, settingsFragment) 

/*Adding to the backStack here and then setting a backStack Listener 
*on the next step made it add the fragment then immediately take it  
*off, giving my empty activity layout.*/ 

     .addToBackStack(null) 
     .commit(); 
getFragmentManager().addOnBackStackChangedListener(
     new FragmentManager.OnBackStackChangedListener() { 
      @Override 
      public void onBackStackChanged() { 
       getFragmentManager() 
         .beginTransaction() 
         .remove(settingsFragment) 
         .commit(); 
      } 
     }); 

Я удалил вызов addToBackStack() и закомментирован слушатель backStack, так как я понял, что мне не нужно, чтобы удалить фрагмент после загрузки активности с ним и только действительно забочусь о повторное использование активности для нескольких фрагментов.

 Смежные вопросы

  • Нет связанных вопросов^_^