Comment instancier mise en page de préférence personnalisée, en utilisant android: attribut de mise en page

StackOverflow https://stackoverflow.com/questions/7830802

  •  27-10-2019
  •  | 
  •  

Question

Je peux définir la mise en page appropriée de préférence par attribut android:layout. Pour un exemple

<Preference
  android:key="friction" 
  android:title="@string/friction" 
  android:layout="@layout/friction_fragment" 
  android:shouldDisableView="true" 
  android:defaultValue="30" 
  android:enabled="true"
  android:selectable="true" 
  android:summary="Bite friction">
</Preference>

où la mise en page est

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:text="@string/friction" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"></TextView>
    <SeekBar android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/sbFriction"></SeekBar>
    <TextView android:text="@string/friction_little" android:id="@+id/txtSummary" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <Button android:text="Button" android:id="@+id/btnFriction" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

Je peux obtenir des vues en OnCreate dans PreferenceActivity

    Preference fric = (Preference)this.findPreference("friction");
    View v = fric.getView(null, null);
    SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction);
    sbFriction.setOnSeekBarChangeListener(this);
    Button btnFric = (Button) v.findViewById(R.id.btnFriction);
    btnFric.setOnClickListener(m_onClick);

mais ces auditeurs d'événements, que j'ai mis, ne sont pas déclenchés. Comment puis-je attraper ces événements, par exemple - clic de bouton. Éditer. Non, il n'a pas tiré aucune exception. Voici un code plus détaillé

public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnSeekBarChangeListener
{

    private TextView m_txtSummary;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        ListPreference difficulty = (ListPreference)this.findPreference("difficulty");
        difficulty.setSummary(difficulty.getEntry());
        difficulty.setOnPreferenceChangeListener(this);

        Preference fric = (Preference)this.findPreference("friction");
        View v = fric.getView(null, null);
        SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction);
        sbFriction.setOnSeekBarChangeListener(this);
        Button btnFric = (Button) v.findViewById(R.id.btnFriction);
        btnFric.setOnClickListener(m_onClick);

        m_txtSummary = (TextView)v.findViewById(R.id.txtSummary);

        fric.setSummary(fric.toString());
        fric.setOnPreferenceChangeListener(this);

        CheckBoxPreference music = (CheckBoxPreference)this.findPreference("music");
        music.setOnPreferenceChangeListener(this);
    }

    private OnClickListener m_onClick = new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            v.getId();
        }

    };

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if(newValue instanceof Boolean)
            return true;

        preference.setSummary(newValue.toString());
        return true;
    }

    @Override
    public void onProgressChanged(SeekBar v, int nProgress, boolean arg2) {
        // TODO Auto-generated method stub
        m_txtSummary.append(" " + nProgress);
        m_txtSummary.invalidate();
    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub
        //notifyChanged();
    }
}
Était-ce utile?

La solution

Je ne suis pas sûr que vous êtes en mesure d'utiliser une mise en page personnalisée en conjonction avec un PreferenceActivity de la façon que vous décrivez ci-dessus.

Je crois que vous devez soit:

Utilisez un PreferenceScreen via addPreferencesFromResource() et mettre en œuvre des classes comme CheckBoxPreference, DialogPreference et MultiSelectListPreference pour les articles de SharedPreferences. ( exemple )

ou

Créer un Activity personnalisé (non PreferenceActivity) avec mise en page personnalisée (en utilisant setContentView()), et le crochet manuellement dans le SharedPreferences à l'aide PreferenceManager.getDefaultSharedPreferences() les éditer dans les écouteurs d'événements (View.onClickListener(), etc.) en utilisant SharedPreferences.Editor.

L'espoir qui fait sens.

Autres conseils

En fait, je trouve une autre solution. Vous pouvez toujours utiliser le Preferenceability:

Ajoutez simplement un fragment qui appelle la mise en page personnalisée et d'ajouter sa catégorie. Cependant, vous aurez un avertissement dans le Manifest: (que vous pouvez ignorer ou fixe)

[res] (AndroidManifest.xml)

               android:name=".SettingsActivity_CUSTOMLAYOUT1"

"YOURPACKAGE.SettingsActivity_CUSTOMLAYOUT1 est pas public"

Il est seulement appelé à partir de votre SettingsActivity afin que vous puissiez l'ignorer

ou

si vous voulez appeler cette activité à l'extérieur juste créer une propre classe pour elle et nommez-le SettingsActivity_CUSTOMLAYOUT1.java.

CODE:

[java] (SettingsActivity.java)

public class SettingsActivity extends AppCompatPreferenceActivity {

    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();

            if (preference instanceof ListPreference) {
                ListPreference listPreference = (ListPreference) preference;
                int index = listPreference.findIndexOfValue(stringValue);
                preference.setSummary(
                        index >= 0
                                ? listPreference.getEntries()[index]
                                : null);

            } else if (preference instanceof RingtonePreference) {
                if (TextUtils.isEmpty(stringValue)) {
                    preference.setSummary(R.string.pref_ringtone_silent);

                } else {
                    Ringtone ringtone = RingtoneManager.getRingtone(
                            preference.getContext(), Uri.parse(stringValue));

                    if (ringtone == null) {                          
                        preference.setSummary(null);
                    } else {
                        String name = ringtone.getTitle(preference.getContext());
                        preference.setSummary(name);
                    }
                }

            } else {
                preference.setSummary(stringValue);
            }
            return true;
        }
    };

    private static boolean isXLargeTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
    }

    private static void bindPreferenceSummaryToValue(Preference preference) {
        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                PreferenceManager
                        .getDefaultSharedPreferences(preference.getContext())
                        .getString(preference.getKey(), ""));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupActionBar();
    }


    private void setupActionBar() {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onIsMultiPane() {
        return isXLargeTablet(this);
    }

    @Override
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }

    protected boolean isValidFragment(String fragmentName) {
        return PreferenceFragment.class.getName().equals(fragmentName)
                || YOURFRAGMENT1.class.getName().equals(fragmentName)
                || YOURFRAGMENT2.class.getName().equals(fragmentName)
                || CUSTOMLAYOUT1.class.getName().equals(fragmentName)
                //... Add Fragments
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class YOURFRAGMENT1 extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.YOURFRAGMENTXML1);
            setHasOptionsMenu(true);    
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class YOURFRAGMENT2 extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_private_data);
            setHasOptionsMenu(true);    
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class FRAGMENTFORCUSTOMLAYOUT1 extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            startActivity(new Intent(getActivity(), SettingsActivity.class));       
            startActivity(new Intent(getActivity(), CUSTOMLAYOUT1.class));
            setHasOptionsMenu(true);

        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }   

}

class SettingsActivity_CUSTOMLAYOUT1 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.CUSTOMLAYOUT1);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

[xml] (pref_headers.xml)

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">

        <header
        android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT1"
        android:icon="@drawable/YOURICON"
        android:title="@string/TITLE"       
        android:summary="@string/SUBTITLE"/>

        <header
        android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT2"
        android:icon="@drawable/YOURICON"
        android:title="@string/TITLE"       
        android:summary="@string/SUBTITLE"/>

        <header
        android:fragment="YOURPACKAGE.SettingsActivity$CUSTOMLAYOUT1"
        android:icon="@drawable/YOURICON"
        android:title="@string/TITLE"       
        android:summary="@string/SUBTITLE"/>


</preference-headers>

[layout] (CUSTOMLAYOUT1.xml)

<?xml version="1.0" encoding="utf-8"?>
<...your custom layout>

Ne pas oublier d'ajouter dans Manifest.

[res] (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application   

        //Add activity
        <activity
            android:name=".SettingsActivity_CUSTOMLAYOUT1"
            android:parentActivityName=".SettingsActivity">
        </activity>


    </application>

</manifest>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top