9

Ho iniziato a gestire le preferenze in un PreferenceFragment. Ecco quello che ho:Come gestire i divisori in un PreferenceFragment?

my_preferences

Sto cercando di:

  1. sbarazzarsi dei divisori tra gli elementi. Suppongo che questo possa essere definito dagli stili, ma non riesco a capire come. Ho provato ad ottenere la preferenza ListView in runtime chiamando findViewById(android.R.id.list), come ho letto da qualche parte, ma restituisce il valore di null.

  2. set nuovo, a tutta larghezza divisori proprio sopra le intestazioni, come visto here. Per esempio in questo caso voglio un divisore a tutta larghezza sopra "Statistiche", ma non sopra "Generali" che è in cima alla lista.

L'unico modo che mi viene in mente è la creazione di divisori preferenze come falsi, come con:

<Preference 
    android:layout="@layout/divider" //here I set width and a divider resource 
    /> 

<PreferenceCategory ... /> 

Il problema principale è che la mia PreferenceFragment (o la ActionBarActivity è in) ha una certa sinistra/riempimento destro, che rende qualsiasi divisore che aggiungo in preferences.xml non copre l'intera larghezza.

Quindi la mia domanda sono:

  • Come posso liberarmi di divisori di default, voce-voce che si può vedere nell'immagine?

  • Come posso impostare i divisori a tutta larghezza sopra le intestazioni o come posso eliminare il frammento interno/il riempimento attività? Ovviamente il mio layout di attività non ha alcun riempimento esplicito.

+0

Ciao, hai ricevuto la risposta ?. puoi aiutarmi con la soluzione se hai? – Naruto

+0

@Naruto in breve ho usato 'list = findViewById (android.R.id.list)' e poi 'list.setDivider (null)'.Per evitare NPE, devi chiamare questo 'onResume' piuttosto che' onCreate'. Per quanto riguarda l'altro problema, cercherò di inviare una risposta completa oggi. – natario

+0

Ehi, grazie per la risposta. Sto usando i frammenti non un'attività. la mia classe sembra che 'public class SettingsFragment estende PreferenceFragment'. Quindi in questo caso come possiamo ottenere? qualsiasi aiuto. – Naruto

risposta

7

Had totalmente dimenticato di questa domanda, sarà inviare una risposta ora di aiutare gli altri. Ho risolto spostando il mio codice nel metodo onResume() dell'attività che ospita il mio PreferenceFragment. Penso che ci siano molti altri punti in cui è possibile richiamare uno ListView non nullo utilizzando findViewById(android.R.id.list).

public boolean mListStyled; 

@Override 
public void onResume() { 
    super.onResume(); 
    if (!mListStyled) { 
     View rootView = getView(); 
     if (rootView != null) { 
      ListView list = (ListView) rootView.findViewById(android.R.id.list); 
      list.setPadding(0, 0, 0, 0); 
      list.setDivider(null); 
      //any other styling call 
      mListStyled = true; 
     } 
    } 
} 

Probabilmente si può sbarazzarsi del controllo rootView, ma allo stesso tempo si potrebbe anche voler controllare per list != null. In ogni caso, non ho mai affrontato alcun NPE.

Quindi, setDivider(null) toglie i divisori articolo.Sono riuscito ad aggiungere divisori che coprono l'intera larghezza dello schermo:

  • Rimozione del riempimento da list;
  • Aggiunta una preferenza personalizzato nel mio XML:

n

<Preference 
    android:title="divider" 
    android:selectable="false" 
    android:layout="@layout/preference_divider"/> 
+0

L'ho fatto, ma non mostrare il divisore all'interno della lista, per favore aiutatemi. Grazie! –

+0

dopo l'API 21 viene restituito un recyclerview, se viene eseguita la ricerca di 'android.R.id.list'. setDivider (null) in onStart di PreferenceFragmentCompat dovrebbe aiutare. – Fattum

+0

Puoi condividere il tuo 'preference_divider.xml'? – Zoker

16

aggiungere questo codice sotto la PreferenceFragment:

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // remove dividers 
     View rootView = getView(); 
     ListView list = (ListView) rootView.findViewById(android.R.id.list); 
     list.setDivider(null); 

    } 
+4

Perfetto! Veloce, facile, breve. Ogni altra risposta (che non ha funzionato nemmeno) che ho trovato sembrava eccessiva. Grazie! –

+0

dobbiamo creare una vista elenco e quindi impostare ogni elemento come layout per lo stesso ?! –

+0

Dopo ANDROID 21 viene utilizzato un RecyclerView per visualizzare il contenuto basato su elenchi, pertanto R.id.list restituisce un riferimento RecyclerView, che non può essere gestito nello stesso modo utilizzato con ListView. – Fattum

9

Anche se un po 'in ritardo `m avendo stessi problemi con i divisori a schermo preff e ha trovato questa soluzione: Set stile personalizzato per l'attività di hosting e aggiungere allo stile:

<item name="android:listDivider">@null</item> 

e 'in realtà fa la stessa impostazione codice di depressione, ma si salva un findById e ho pensate che sia più chiaro con gli stili impostati tramite

+0

Impressionante. Il più facile. –

1

Per PreferenceFragmentCompat, ListView non funziona. Ma questo funziona come un fascino:

<style name="PrefsTheme" parent="PreferenceThemeOverlay.v14.Material"> 
    <item name="android:divider">@null</item> 
    <item name="android:dividerHeight">0dp</item> 
</style> 

aggiungere questo alla tua app tema:

<item name="preferenceTheme">@style/PrefsTheme</item> 
0

se si utilizza un PreferenceFragment, è possibile utilizzare ListView. setDivider(null); se si utilizza PreferenceFragmentCompat, è possibile utilizzare PreferenceFragmentCompat. setDivider(Drawable divider) o setDividerHeight(int height);

0

Nuova soluzione per le nuove API Android 24 e successive (25 dicembre 2017).

Ho trovato dopo aver provato molti modi su StackOverflow, ma non funziona, o semplicemente funziona ma non funziona in nestestPreferenceScreen.

Frist, è necessario trovare ListView dalla corrente frammento visualizzazione, e rimuovere il divisore:

private fun removeDividerInCurrentFragment() { 
    [email protected](android.R.id.content)?.let { 
     it.view?.findViewById<ListView?>(android.R.id.list)?.let { 
      it.divider = null 
      it.dividerHeight = 0 
     } 
    } 
} 

In secondo luogo, per rimuovere il divisore quando frammento impegnata, chiamata al metodo di cui sopra (removeDividerInCurrentFragment) per rimuovere divisore di ListView.

Se si dispone di nestest PreferenceScreen. Registrati ascoltatore quando frammento è cambiato nel vostro PreferenceActivity da implementare FragmentManager.OnBackStackChangedListener protocollo:

class YourPreferenceActivity : PreferenceActivity(), FragmentManager.OnBackStackChangedListener { 
    override fun onBackStackChanged() { 
     [email protected]() 
    } 
} 

Infine, registrare i cambiamenti backstack ascoltatore dalla chiamata fragmentManager.addOnBackStackChangedListener([email protected] YourPreferenceActivity) in onCreate. E rimuovere il listener delle modifiche del backstack chiamando il fragmentManager.removeOnBackStackChangedListener nel metodo onDestroyed.

Buona fortuna!

0

È possibile rielaborare il divisore utilizzando questo tema.

<style name="PreferenceFragment.Material"> 
    <item name="android:divider">@drawable/preference_list_divider_material</item> 
</style>