it-swarm.com.de

So fügen Sie der Voreinstellung Symbole hinzu

Ich mache eine App, die die PreferenceActivity erweitert, und ich möchte jeder Präferenz ein Symbol hinzufügen.

Ich habe eine ähnliche Frage gelesen, und dies ist die Antwort mit mehr Ansehen:

CommonsWare Sprich:

Die Anwendung "Einstellungen" verwendet eine private benutzerdefinierte PreferenceScreen-Unterklasse, um das Symbol "IconPreferenceScreen" zu erhalten. Es umfasst 51 Zeilen Code, einschließlich der Kommentare, es sind jedoch auch einige benutzerdefinierte Attribute erforderlich. Die einfachste Möglichkeit besteht darin, all das in Ihr Projekt zu kopieren, auch wenn Sie das nicht mögen.

Aber ich kann es nicht funktionieren lassen. Fürs Erste habe ich die Klasse IconPreferenceScreen auf mein Projekt geklont. Und ich weiß nicht, was ich danach tun muss. Ich versuche, ein neues IconPreferenceScreen zu erstellen. Ich kann es nicht zum Laufen bringen.

    IconPreferenceScreen test = new IconPreferenceScreen();
    test.setIcon(icon);
22
Tony Ceralva

Nach vielen Tests und vielen Fehlern konnte ich es bekommen!

Ich musste das tun:

1 - Klonen Sie die Klasse IconPreferenceScreen aus der Android-App für native Einstellungen (danke CommonWare)

2 - Klonen Sie die Layout-Datei pref_ion_icon.xml aus der Android-Einstellungen-App.

3 - Deklarieren Sie das IconPreferenceScreen-Format in der Datei attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="IconPreferenceScreen">
         <attr name="icon" format="reference" />
    </declare-styleable>
</resources>

4 - Deklarieren Sie den IconPreferenceScreen in der Datei preference.xml:

<com.app.example.IconPreferenceScreen 
                Android:title="IconPreferenceScreen Title"
                Android:summary="IconPreferenceScreen Summary"
                Android:key="key1" />

5 - Zum Schluss das Icon für die Präferenz setzen, in der Präferenzklasse:

addPreferencesFromResource(R.xml.example);
IconPreferenceScreen test = (IconPreferenceScreen) findPreference("key1");
Resources res = getResources();
Drawable icon = res.getDrawable(R.drawable.icon1);
test.setIcon(icono1);

Nochmals vielen Dank an CommonsWare für den Start und die Erklärung.

Dies ist die geklonte IconPreferenceScreen-Klasse:

package com.app.example;

import Android.content.Context;
import Android.content.res.TypedArray;
import Android.graphics.drawable.Drawable;
import Android.preference.Preference;
import Android.util.AttributeSet;
import Android.view.View;
import Android.widget.ImageView;

public class IconPreferenceScreen extends Preference {

    private Drawable mIcon;

    public IconPreferenceScreen(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public IconPreferenceScreen(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setLayoutResource(R.layout.preference_icon);
        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.IconPreferenceScreen, defStyle, 0);
        mIcon = a.getDrawable(R.styleable.IconPreferenceScreen_icon);
    }

    @Override
    public void onBindView(View view) {
        super.onBindView(view);
        ImageView imageView = (ImageView) view.findViewById(R.id.icon);
        if (imageView != null && mIcon != null) {
            imageView.setImageDrawable(mIcon);
        }
    }

    public void setIcon(Drawable icon) {
        if ((icon == null && mIcon != null) || (icon != null && !icon.equals(mIcon))) {
            mIcon = icon;
            notifyChanged();
        }
    }

    public Drawable getIcon() {
        return mIcon;
    }
}

Und dies ist das geklonte preference_icon.xml-Layout:

<LinearLayout Android:id="@+Android:id/iconpref"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content"
    Android:minHeight="?android:attr/listPreferredItemHeight"
    Android:gravity="center_vertical" 
    Android:paddingRight="?android:attr/scrollbarSize">
    <ImageView Android:id="@+id/icon" 
    Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="6dip"
        Android:layout_marginRight="6dip" 
        Android:layout_gravity="center" />
    <RelativeLayout Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="2dip"
        Android:layout_marginRight="6dip" 
        Android:layout_marginTop="6dip"
        Android:layout_marginBottom="6dip" 
        Android:layout_weight="1">
        <TextView Android:id="@+Android:id/title"
            Android:layout_width="wrap_content" 
            Android:layout_height="wrap_content"
            Android:singleLine="true" 
            Android:textAppearance="?android:attr/textAppearanceLarge"
            Android:ellipsize="Marquee" 
            Android:fadingEdge="horizontal" />
        <TextView Android:id="@+Android:id/summary"
            Android:layout_width="wrap_content" 
            Android:layout_height="wrap_content"
            Android:layout_below="@Android:id/title" 
            Android:layout_alignLeft="@Android:id/title"
            Android:textAppearance="?android:attr/textAppearanceSmall"
            Android:maxLines="2" />
    </RelativeLayout>
</LinearLayout>
18
Tony Ceralva

Heute können Sie einfach Android verwenden: icon attr seit API 11 verfügbar :)

36
Vadim

Der beste und einfachste Weg, um das zu erreichen, was Sie möchten, besteht darin, das Symbol zu einem 9-Patch-Symbol mit dem rechten Rand als dehnbaren Bereich zu machen.

Angenommen, Sie haben eine EditTextPreference, die Sie vor dem Titel und der Zusammenfassung ein Symbol hinzufügen möchten.

Sie erstellen eine MyEditTextPreference-Klasse, die EditTextPreference erweitert, und überschreiben die getView-Methode, um Ihr 9-Patch-Symbol als Hintergrundressource hinzuzufügen.

Hier ist ein Beispielcode, der funktioniert:

public class MyEditTextPreference extends EditTextPreference {

    public MyEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public View getView(View convertView, ViewGroup parent) {
        View view = super.getView(convertView, parent);
        view.setBackgroundResource(R.drawable.my_icon);
        return view;
    }
}

Da es sich bei dem Symbol um einen 9er-Patch handelt, wird der transparente Teil durch das Symbol bis zum rechten Ende der Zelle gestreckt, sodass das Symbol auf der linken Seite platziert wird.

Dies ist eine sehr saubere Lösung für Ihr Problem.

11
Henrique Rocha

naja zu spät, aber vielleicht hilft es jemandem das Problem ist, dass Sie dieses Symbol nur als Kind einer Kategorie hinzufügen können, wie dies in meinen Codebeispielen der Fall ist. Auf dem Bildschirm wird nur das Symbol für den Bearbeitungstext angezeigt.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
<PreferenceCategory
        Android:title="@string/pref_profil"
        Android:icon="@drawable/profile" // it wont show
        Android:key="pref_key_storage_settings">

        <EditTextPreference
            Android:key="edit_text_preference_1"
            Android:selectAllOnFocus="true"
            Android:singleLine="true"
            Android:icon="@drawable/profile"
            Android:title="Edit text preference" />

        <Preference
            Android:key="pref_key_sms_delete_limit"
            Android:summary="HELLO2"
            Android:title="HELLO" />
    </PreferenceCategory>

</PreferenceScreen>

ergebnis:

 enter image description here

3
mehmet

Dank an:

Folgendes hat für mich gearbeitet:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="YOUR.PACKAGE.NAME">
    <application
        Android:label="@string/app_name"
        Android:icon="@drawable/icon">
        <activity
            Android:name="AndroidMain"
            Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

res/values ​​/ strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="app_name">YOUR_APP_NAME</string>
    <string name="about">About</string>
</resources>

res/values ​​/ attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="IconPreference">
        <attr name="icon" format="reference" />
    </declare-styleable>
</resources>

res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:settings="http://schemas.Android.com/apk/res/YOUR.PACKAGE.NAME"
    >
    <PreferenceCategory
        Android:title="Main"
        Android:key="mainPrefCat">
        <YOUR.PACKAGE.NAME.IconPreference
                Android:title="Exit"
                Android:summary="Quit the app."
                settings:icon="@drawable/YOUR_ICON"
                Android:key="quitPref">
        </YOUR.PACKAGE.NAME.IconPreference>
    </PreferenceCategory>
</PreferenceScreen>

res/layout/preference_icon.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+Android:id/widget_frame"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:minHeight="?android:attr/listPreferredItemHeight"
    Android:gravity="center_vertical"
    Android:paddingRight="?android:attr/scrollbarSize">
    <ImageView
        Android:id="@+id/icon"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="6dip"
        Android:layout_marginRight="6dip"
        Android:layout_gravity="center" />
    <RelativeLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="2dip"
        Android:layout_marginRight="6dip"
        Android:layout_marginTop="6dip"
        Android:layout_marginBottom="6dip"
        Android:layout_weight="1">
        <TextView Android:id="@+Android:id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:singleLine="true"
            Android:textAppearance="?android:attr/textAppearanceLarge"
            Android:ellipsize="Marquee"
            Android:fadingEdge="horizontal" />
        <TextView Android:id="@+Android:id/summary"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_below="@Android:id/title"
            Android:layout_alignLeft="@Android:id/title"
            Android:textAppearance="?android:attr/textAppearanceSmall"
            Android:maxLines="2" />
    </RelativeLayout>
</LinearLayout>

Entsprechend große Icons unter:

res/drawable-hdpi/YOUR_ICON.png
res/drawable-mdpi/YOUR_ICON.png
res/drawable-ldpi/YOUR_ICON.png

AndroidMain.scala:

class AndroidMain extends PreferenceActivity {
  override def onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    addPreferencesFromResource(R.layout.main)
  }
}

IconPreference.scala:

class IconPreference(context: Context, attrs: AttributeSet, defStyle: Int) extends Preference(context, attrs, defStyle) {
    def this(context: Context, attrs: AttributeSet) = this(context, attrs, 0)

    setLayoutResource(R.layout.preference_icon);
    val a: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.IconPreference, defStyle, 0);
    val _icon: Drawable = a.getDrawable(R.styleable.IconPreference_icon);

    override def onBindView(view: View) {
        super.onBindView(view)
        val imageView: ImageView = view.findViewById(R.id.icon).asInstanceOf[ImageView]
        if (imageView != null && _icon != null) {
            imageView.setImageDrawable(_icon);
        }
    }
}
1
W1M0R

Ich mache eine App, in der PreferenceActivity die Hauptaktivität ist, und ich möchte jeder benutzerdefinierten Voreinstellung ein Symbol hinzufügen. Wie dieses Bild:

Das ist kein PreferenceActivityname__.

Wie kann ich dem PreferenceScreen ein Symbol hinzufügen?

Es wird für Sie einfacher sein, nur Ihre eigene Aktivität zu erstellen, die zum Speichern der Einstellungen verwendet wird.

Ich persönlich würde das Symbol einfach überspringen und das reguläre System PreferenceScreenund PreferenceActivityverwenden.

1
CommonsWare

Wenn Sie eine Listenpräferenz mit {Text und Symbol} benötigen, können Sie sich diese Listenpräferenz mit Symbolen anschauen

0
tjm1706

Für eine "vernünftige" Antwort können Sie entweder die von Henrique Rocha beschriebene 9-Patch-Methode verwenden oder Folgendes:

Erstellen Sie eine neue Preference-Klasse, die EditTextPreference erweitert, und lassen Sie onCreateView überschreiben.

@Override
protected View onCreateView(ViewGroup parent)
{
    View v = LayoutInflater.from(getContext()).inflate(R.layout.iconpreference, null);

    return v;
}

Erstellen Sie ein neues Layout-XML mit dem Namen iconpreference. In diesem XML können Sie ein Standard-Layout für die Voreinstellungen verwenden. Sie können es grundsätzlich beliebig verändern. Einfaches Beispiel:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal" >

    <ImageView Android:layout_width="48dp"
        Android:layout_height="48dp"
        Android:src="@drawable/checkmark_black"/>

    <include layout="@layout/preference_holo" />

</LinearLayout>

Das ist alles!

0
JanCor