web-dev-qa-db-de.com

Wie füge ich Symbolleisten zu AppCompatPreferenceActivity hinzu?

Ich versuche, der AppCompatPreferenceActivity Symbolleisten hinzuzufügen, aber ich weiß nicht, wie ich das machen soll.

Kannst du mir sagen wie?

14
LKH

Kopieren Sie zuerst AppCompatPreferenceActivity in Ihr Projekt.

Die benutzen es so:

public class SettingsActivity extends AppCompatPreferenceActivity {

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

    private void setupActionBar() {
        Toolbar toolbar;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            ViewGroup root = (ViewGroup) findViewById(Android.R.id.list).getParent().getParent().getParent();
            toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.view_toolbar, root, false);
            root.addView(toolbar, 0);
        } else {
            ViewGroup root = (ViewGroup) findViewById(Android.R.id.content);
            ListView content = (ListView) root.getChildAt(0);
            root.removeAllViews();
            toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.view_toolbar, root, false);
            int height;
            TypedValue tv = new TypedValue();
            if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
                height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            } else {
                height = toolbar.getHeight();
            }
            content.setPadding(0, height, 0, 0);
            root.addView(content);
            root.addView(toolbar);
        }
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

Es ist keine sehr elegante Lösung, aber es funktioniert. Getestet an Lebkuchen und Lutscher.

16
David Vávra

Versuche dies:

public class SettingsActivity extends AppCompatPreferenceActivity {

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

        LinearLayout root = (LinearLayout) findViewById(Android.R.id.list).getParent().getParent().getParent();
        Toolbar toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar_settings, root, false);
        root.addView(toolbar, 0);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

EDIT

AppCompatPreferenceActivity ist diese Demoklasse für Supprt v7:

https://Android.googlesource.com/platform/development/+/nougat-release/samples/Support7Demos/src/com/example/Android/supportv7/app/AppCompatPreferenceActivity.Java

5
Simone

Ich habe dieses Putting-Thema zu Activity auf AndrodManifest gelöst

Android:theme="@style/Theme.AppCompat.Light"
3

Verwenden Sie PreferenceFragment. Sie können dies in Ihrer Aktivität tun:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new MyPreferenceFragment()).commit();

Und das MyPreferenceFragment sieht so aus:

public class MyPreferenceFragment extends PreferenceFragment{
    @Override
    public void onCreate(final Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);
    }
}

Hoffe das hat geholfen!

1
Harry

Hier ist meine toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:local="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
Android:elevation="@dimen/appbar_elevation"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
Android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

durch Hinzufügen der folgenden Codezeilen am Anfang von setupActionBar () wird die Symbolleiste zur Laufzeit hinzugefügt.

getLayoutInflater().inflate(R.layout.toolbar, 
(ViewGroup)findViewById(Android.R.id.content));
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

diese Arbeit für mich freundlich!

Danke für galdin.

1
Sanjay Chan

Sie können Android Studio verwenden, um eine Einstellungsaktivität zu generieren, und es kann automatisch ein Beispielcode wie folgt generiert werden:

import Android.annotation.TargetApi;
import Android.content.Context;
import Android.content.Intent;
import Android.content.res.Configuration;
import Android.media.Ringtone;
import Android.media.RingtoneManager;
import Android.net.Uri;
import Android.os.Build;
import Android.os.Bundle;
import Android.preference.ListPreference;
import Android.preference.Preference;
import Android.preference.PreferenceActivity;
import Android.preference.PreferenceFragment;
import Android.preference.PreferenceManager;
import Android.preference.RingtonePreference;
import Android.support.v7.app.ActionBar;
import Android.text.TextUtils;
import Android.view.MenuItem;

import Java.util.List;

/**
 * A {@link PreferenceActivity} that presents a set of application settings. On
 * handset devices, settings are presented as a single list. On tablets,
 * settings are split by category, with category headers shown to the left of
 * the list of settings.
 * <p>
 * See <a href="http://developer.Android.com/design/patterns/settings.html">
 * Android Design: Settings</a> for design guidelines and the <a
 * href="http://developer.Android.com/guide/topics/ui/settings.html">Settings
 * API Guide</a> for more information on developing a Settings UI.
 */
public class SettingsActivity extends AppCompatPreferenceActivity {
    /**
     * A preference value change listener that updates the preference's summary
     * to reflect its new value.
     */
    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener =
            new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange ( Preference preference, Object value ) {
                    String stringValue = value.toString();

                    if ( preference instanceof ListPreference ) {
                        // For list preferences, look up the correct display value in
                        // the preference's 'entries' list.
                        ListPreference listPreference = ( ListPreference ) preference;
                        int index = listPreference.findIndexOfValue( stringValue );

                        // Set the summary to reflect the new value.
                        preference.setSummary( index >= 0 ? listPreference.getEntries()[ index ] : null );

                    }
                    else if ( preference instanceof RingtonePreference ) {
                        // For ringtone preferences, look up the correct display value
                        // using RingtoneManager.
                        if ( TextUtils.isEmpty( stringValue ) ) {
                            // Empty values correspond to 'silent' (no ringtone).
                            preference.setSummary( R.string.pref_ringtone_silent );

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

                            if ( ringtone == null ) {
                                // Clear the summary if there was a lookup error.
                                preference.setSummary( null );
                            }
                            else {
                                // Set the summary to reflect the new ringtone display
                                // name.
                                String name = ringtone.getTitle( preference.getContext() );
                                preference.setSummary( name );
                            }
                        }

                    }
                    else {
                        // For all other preferences, set the summary to the value's
                        // simple string representation.
                        preference.setSummary( stringValue );
                    }
                    return true;
                }
            };

    /**
     * Helper method to determine if the device has an extra-large screen. For
     * example, 10" tablets are extra-large.
     */
    private static boolean isXLargeTablet ( Context context ) {
        return ( context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK ) >=
                Configuration.SCREENLAYOUT_SIZE_XLARGE;
    }

    /**
     * Binds a preference's summary to its value. More specifically, when the
     * preference's value is changed, its summary (line of text below the
     * preference title) is updated to reflect the value. The summary is also
     * immediately updated upon calling this method. The exact display format is
     * dependent on the type of preference.
     *
     * @see #sBindPreferenceSummaryToValueListener
     */
    private static void bindPreferenceSummaryToValue ( Preference preference ) {
        // Set the listener to watch for value changes.
        preference.setOnPreferenceChangeListener( sBindPreferenceSummaryToValueListener );

        // Trigger the listener immediately with the preference's
        // current value.
        sBindPreferenceSummaryToValueListener.onPreferenceChange( preference,
                                                                  PreferenceManager.getDefaultSharedPreferences(
                                                                          preference.getContext() )
                                                                                   .getString( preference.getKey(),
                                                                                               "" ) );
    }

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

    /**
     * Set up the {@link Android.app.ActionBar}, if the API is available.
     */
    private void setupActionBar () {
        ActionBar actionBar = getSupportActionBar();
        if ( actionBar != null ) {
            // Show the Up button in the action bar.
            actionBar.setDisplayHomeAsUpEnabled( true );
            actionBar.setHomeButtonEnabled( true );
        }

    }

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

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

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

    /**
     * This method stops fragment injection in malicious applications.
     * Make sure to deny any unknown fragments here.
     */
    protected boolean isValidFragment ( String fragmentName ) {
        return PreferenceFragment.class.getName().equals( fragmentName ) ||
                GeneralPreferenceFragment.class.getName().equals( fragmentName ) ||
                DataSyncPreferenceFragment.class.getName().equals( fragmentName ) ||
                NotificationPreferenceFragment.class.getName().equals( fragmentName );
    }

    /**
     * This fragment shows general preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi ( Build.VERSION_CODES.HONEYCOMB )
    public static class GeneralPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate ( Bundle savedInstanceState ) {
            super.onCreate( savedInstanceState );
            addPreferencesFromResource( R.xml.pref_general );
            setHasOptionsMenu( true );

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue( findPreference( "example_text" ) );
            bindPreferenceSummaryToValue( findPreference( "example_list" ) );
        }

        @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 );
        }
    }

    /**
     * This fragment shows notification preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi ( Build.VERSION_CODES.HONEYCOMB )
    public static class NotificationPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate ( Bundle savedInstanceState ) {
            super.onCreate( savedInstanceState );
            addPreferencesFromResource( R.xml.pref_notification );
            setHasOptionsMenu( true );

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue( findPreference( "notifications_new_message_ringtone" ) );
        }

        @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 );
        }
    }

    /**
     * This fragment shows data and sync preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi ( Build.VERSION_CODES.HONEYCOMB )
    public static class DataSyncPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate ( Bundle savedInstanceState ) {
            super.onCreate( savedInstanceState );
            addPreferencesFromResource( R.xml.pref_data_sync );
            setHasOptionsMenu( true );

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue( findPreference( "sync_frequency" ) );
        }

        @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 );
        }
    }
}

AppCompatPreferenceActivity.class wie wir alle wissen:

/** * A {@link Android.preference.PreferenceActivity} which implements and proxies the necessary calls * to be used with AppCompat. */

Offensichtlich nimmt AppCompatPreferenceActivity.class eine Sulotion-Klasse für Compat an.

Wenn Sie mit PreferenceActivity kompatible Probleme wie die Symbolleiste oder etwas anderes haben, sollten Sie Folgendes in Betracht ziehen. Wie der von @David Vávra gegebene Antwort, der perfekt ist, kann sein Code den Anspielungs-Trick ausführen. 

Und Sie fragen immer wieder, wie Sie diese Präferenzaktivität einrichten (die ich gesucht habe ... sonst komme ich nicht in Stackoverflow) 

Also las ich diese Seite https://developer.Android.com/reference/Android/preference/PreferenceActivity.html und plus mit den beiden Seiten, die vom javadoc. Angegeben wurden Denken Sie, der Weg zum Kunden der Kindklasse von AppCompatPreferenceActivity lautet folgendermaßen:


Wenn Sie Ihre ** SettingActivity einfach wie eine PreferenceFragment-Darstellung aussehen lassen möchten, sollten Sie diese Methode nicht "onBuildHeaders ()" überschreiben.

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

Zu Ihrer Information wird die Verwendung von pref_headers auf der Seite https://developer.Android.com/reference/Android/preference/PreferenceActivity.html angegeben.

Fügen Sie diese Zeile in Ihre onCreate () - Methode ein.

    addPreferencesFromResource( R.xml.pref_setting );

und gehen Sie zur Konfiguration Ihrer bevorzugten XML (Verwendung auch auf dieser Seite). Führen Sie Ihre App aus und Sie werden feststellen, dass sie funktioniert. Und dann können Sie etwas anderes tun, z. B. das Menü "Dekoration/Menü hinzufügen" in der Symbolleiste/Listener hinzufügen , Oder Sie fügen einfach einen logischen Code für Ihre App hinzu.

0
AlaricNorris