Chcę uzyskać dostęp do poglądów z niestandardowego układu, który został ustawiony na preference

Ustawienia_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
            android:key="storage"
            android:layout="@layout/layout_storage" />

    ...
</PreferenceScreen>

UstawieniaFragment.kt

class SettingsFragment: PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        addPreferencesFromResource(R.xml.settings_screen)
    }
}

Było to pytanie na stackoverflow, ale w tej odpowiedzi, uzyskuje dostęp do widoku z głównego pliku układu nie z preference

PreferenceFragmentmPat niestandardowy układ

A także znalazłem ten artykuł, używa metody onBindView, aby uzyskać dostęp do niestandardowego widoku.

https://code.luasoftware.com/tutorials/android/Override-layout-of-android-preference/

Ale nie ma wywołania metody onBindView w PreferenceFragmentCompat

ZAKTUALIZOWANO

Layout_storage.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:padding="20dp"
        android:orientation="vertical"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <LinearLayout
            android:paddingBottom="5dp"
            android:orientation="horizontal"
            android:layout_width="match_parent" android:layout_height="wrap_content">

        <TextView
                android:textColor="@color/colorGray"
                android:paddingTop="5dp"
                android:layout_weight="1"
                android:text="USED"
                android:layout_width="0dp"
                android:layout_height="wrap_content"/>

        <TextView
                android:textColor="@color/colorGray"
                android:text="FREE"
                android:layout_width="wrap_content" android:layout_height="wrap_content"/>
    </LinearLayout>


    <ProgressBar
            android:progress="30"
            android:scaleY="5"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:id="@+id/progressBar"/>

</LinearLayout>

Teraz chcę uzyskać progressBar

0
Jeeva 21 luty 2019, 08:18

2 odpowiedzi

Najlepsza odpowiedź

Zastąp następującą metodę w PreferenceFragmentCompat:

@Override
protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
    return new PreferenceGroupAdapter(preferenceScreen) {
        public PreferenceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            PreferenceViewHolder holder = super.onCreateViewHolder(parent, viewType);
            View customLayout = holder.itemView;
            if (customLayout.getId() == R.id.myCustomId) {
                // get ref on your layout or modify it
            }
            return holder;
        }
    };
}

Możesz dodać identyfikator w linielayout, aby sprawdzić poprawny układ ...
Mam nadzieję, że to pomoże !

1
avianey 4 styczeń 2020, 08:49

Możesz dodać swój układ preferencji w onCreatePreferences za pomocą setPreferencesFromResource, aby uzyskać więcej szczegółów PreferenceFragmentCentCompat i Androida Ustawienia aplikacji z preferencją Fragment Compat .

public static class SettingsFragment extends PreferenceFragmentCompat {

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    // Load the preferences from an XML resource
    setPreferencesFromResource(R.xml.settings_screen, rootKey);

    SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();

    PreferenceScreen preferenceScreen = getPreferenceScreen();

    int count = preferenceScreen.getPreferenceCount();

    for (int i = 0; i < count ; i++) {
    Preference p = preferenceScreen.getPreference(i);
    if (!(p instanceof CheckBoxPreference)) {
    String value = sharedPreferences.getString(p.getKey(), "");
    setPreferenceSummery(p, value);
      }
     }
}
}

Definicja interfejsu do wywołania zwrotnego, gdy zmieniona jest wspólna preferencja, onSharedPreferenceChanged

    @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

  Preference preference = findPreference(key);

  if (preference != null) {

  if (!(preference instanceof CheckBoxPreference)) {
  String value = sharedPreferences.getString(preference.getKey(), "");
  setPreferenceSummery(preference, value);
        }
     }
  }
1
Adil 21 luty 2019, 08:23