PreferenceFragment se muestra de forma transparente

Estoy intentando mostrar un fragmento de PreferenceFragment después de seleccionar la opción de preferencias en mi ActionBar. Sin embargo, después de reemplazar el contenido actual por el PreferenceFragment , puede ver el contenido antiguo debajo de él. Como en, se puede ver directamente a través de las preferencias.

¿Me estoy perdiendo de algo? He utilizado un ejemplo de un libro propio, que no utiliza ningún archivo de diseño para las preferencias. ¿Necesita eso?

Código usado:

Menú de la barra de herramientas

 private boolean MenuChoice(MenuItem item) { switch (item.getItemId()) { case 0: FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ReaderPreferences prefs = new ReaderPreferences(); fragmentTransaction.replace(android.R.id.content, prefs); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); return true; } return false; } 

PreferenceReader

 public class ReaderPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // --load the preferences from an XML file--- addPreferencesFromResource(R.xml.preference); } } 

Resultado actual:

Introduzca aquí la descripción de la imagen

Como puede ver, mira directamente a través de mis preferencias. ¿Qué hice mal?

Crea tu clase PreferenceFragment.java como esta:

  public class UserPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getView().setBackgroundColor(Color.BLACK); getView().setClickable(true); } } 

El truco es:

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getView().setBackgroundColor(Color.BLACK); getView().setClickable(true); } 

EDITAR:

Editado como sugiere JDenais, aunque no sea estrictamente necesario para el tema.

Tuve el mismo problema y lo resolví // sin tener que iniciar una nueva actividad //. Este método tiene la ventaja de que su actividad principal no pasa por un ciclo de pausa-reanudación. La clave es tener su interfaz de usuario principal como un fragmento, y luego ocultarlo cuando se llama el fragmento Pref. El fragmento principal se puede incluir de forma estática o dinámica.

  FragmentTransaction ft = getFragmentManager().beginTransaction(); AppSettingsFragment prefs = new AppSettingsFragment(); // This adds the newly created Preference fragment to my main layout, shown below ft.add(R.id.main_layout,prefs); // By hiding the main fragment, transparency isn't an issue ft.hide(mMyMainFragment); ft.addToBackStack(null); ft.commit(); 

El main_layout.xml tiene el main_layout.xml aspecto:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- Uncomment for static fragment inclusion --> <!-- fragment android:name="com.legynd.ui.MyMainFragment" android:id="@+id/mainfragment" android:layout_width="match_parent" android:layout_height="match_parent" / --> </RelativeLayout> 

La solución mejor y más portátil se responde aquí

Cual es:

Añadir el siguiente código a tu PreferenceFragment te permitirá agregar un color de fondo, una imagen, etc.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); view.setBackgroundColor(getResources().getColor(android.R.color.your_color)); return view; } 

En la implementación de ReaderPreferences, añada:

 public void onResume() { super.onResume(); getView().setBackgroundColor(Color.WHITE); } 

Utilice un diseño vacío para su actividad de esta manera:

Activity_settings.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/settingsFragment" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> 

Entonces en la actividad onCreate:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); ReaderPreferences mReaderPreferences = new ReaderPreferences (); getSupportFragmentManager().beginTransaction() .replace(R.id.settingsFragment, mReaderPreferences ).commit(); } 

El color de fondo se puede establecer en la vista de fragmentos en onStart (). Como a continuación:

 public class ReaderPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); } @Override public void onStart() { super.onStart(); View v = getView(); v.setBackgroundColor(getActivity().getResources.getColor(R.color.my_color)); } 

Esto funciona para mí en todos mis dispositivos de prueba.

La respuesta aceptada no es la respuesta a lo que la pregunta plantea aquí. De hecho, es una solución que crea una actividad de contenedor para el fragmento de preferencia.

Agregue esto en su Fragmento que extiende PreferenceFragment:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); view.setBackgroundColor(getResources().getColor(android.R.color.white)); return view; } 

Finalmente lo arreglaron con una solución muy fácil.

Simplemente llamé al PreferenceFragment con un nuevo Intent , y funcionó perfectamente.

Para cualquier persona con el mismo problema:

Prefs.java

 public class ReaderPreferences extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // --load the preferences from an XML file--- addPreferencesFromResource(R.xml.preference); } 

En mi pantalla principal al presionar un botón:

 Intent i = new Intent(this, Prefs.class); startActivity(i); 

Eso es todo. Después de configurar las preferencias simplemente presione el botón Atrás y ya está.

Yo también estaba atascado con el mismo problema, y ​​después de probar un par de cosas que encontré nuestro que estaba sucediendo porque en mi caso había mezclado dos versiones diferentes de Fragmentos y FragmentManagers.

El onCreate de mi MainActivity se parecía a esto:

 getSupportFragmentManager().beginTransaction() .add(R.id.container, new MainFragment()) .commit(); 

Sin embargo, cuando quise reemplazar este MainFragment con mi propio PreferenceFragment, intenté usar algo similar a lo que usaste:

 getFragmentManager().beginTransaction() .replace(R.id.container, new SettingsFragment()) .addToBackStack(null) .commit(); 

La forma en que lo entiendo es que, debes usar el mismo tipo de FragmentManager para reemplazar a trabajar, así que sólo tenía que seguir adelante y hacer los cambios adecuados a la forma en que cableé el MainFragment haciendo que se vea así:

 getFragmentManager().beginTransaction() .add(R.id.container, new MainFragment()) .commit(); 

Por supuesto, tuve que refactor MainFragment para extender desde android.app.Fragment lugar de android.support.v4.app.Fragment

Intenté la solución de Shayan_Aryan, pero mi aplicación estaba muriendo con error:

 Your content must have a ListView whose id attribute is 'android.R.id.list' 

Así que tuve que crear un LinearLayout sin texto en el caso vacío. Bueno, supongo que hay una solución más elegante, pero este fue el único que funcionó para mí.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/android:list" android:layout_width="match_parent" android:layout_height="match_parent"/> <TextView android:id="@+id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> </LinearLayout> 

Utilicé muchas técnicas pero no gané
Finalmente lo arreglé agregando fondo del contenedor o el diseño del fragmento como este

 android:background="@android:color/white" 

Usted apenas necesita agregar en su disposición o la opinión del envase de usted fragmento
Espero que ayude

  • ¿Cómo mostrar y ocultar las preferencias en Android dinámicamente?
  • Android: Cómo obtener el tiempo de un TimePicker cuando se escribe en
  • ¿Por qué no Fragment retener el estado cuando se gira la pantalla?
  • ¿Cómo establecer el valor RingtonePreference del código?
  • ¿Cómo obtener las preferencias del sistema Android?
  • ¿Debo usar múltiples archivos de preferencia o sólo uno?
  • Cambiar el color del selector de una preferencia
  • SharedPreferences sobreescribe otro valor
  • SharedPreferences.onSharedPreferenceChangeListener no se llama constantemente
  • Valor predeterminado de las preferencias de Android
  • Guardar ArrayList en las preferencias compartidas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.