web-dev-qa-db-ja.com

設定にアイコンを追加する方法

PreferenceActivityを拡張するアプリを作成していて、各Preferenceにアイコンを追加したいと思います。

私は同様の質問を読みました、そしてこれはより評判の良い答えです:

CommonsWare Say:

設定アプリケーションは、プライベートカスタムPreferenceScreenサブクラスを使用してアイコン-IconPreferenceScreenを作成します。コメントを含む51行のコードですが、カスタム属性も必要です。最も簡単なオプションは、それが気に入らなくても、すべてをプロジェクトに複製することです。

しかし、私はそれを機能させることができません。ここでは、クラスIconPreferenceScreenをプロジェクトに複製しました。そして、私はこの後何をしなければならないのか分かりません。新しいIconPreferenceScreenを作成しようとしていますが、機能させることができません。

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

多くのテストと多くの失敗の後で、私はそれを得ることができました!

私はこれをしなければなりませんでした:

1-​​= Androidネイティブ設定アプリからのクラスIconPreferenceScreenのクローン(CommonWareに感謝))

2- Android設定アプリからレイアウトファイルpreference_icon.xmlを複製します。

- attrs.xmlファイルでスタイル可能なIconPreferenceScreenを宣言します。

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

4- preference.xmlファイルでIconPreferenceScreenを宣言します。

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

5-最後に、設定クラスの設定のアイコンを設定します。

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

どこから始めればよいか、そして彼の説明を教えてくれたCommonsWareに再度感謝します。

これは複製されたIconPreferenceScreenクラスです:

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

これはクローンされたpreference_icon.xmlレイアウトです:

<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>
19
Tony Ceralva

今日はAndroid:icon attrをAPI 11以降で使用できます:)

40
Vadim

目的を達成するための最良かつ最も簡単な方法は、アイコンを9パッチのアイコンにして、右側の境界を伸縮可能な領域にすることです。

タイトルと概要の前にアイコンを追加するEditTextPreferenceがあるとします。

EditTextPreferenceを拡張するMyEditTextPreferenceクラスを作成し、getViewメソッドをオーバーライドして、9パッチアイコンをバックグラウンドリソースとして追加します。

機能するサンプルコードを次に示します。

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

アイコンは9パッチなので、アイコンはセルの右端まで透明部分を引き伸ばし、アイコンを左側に配置します。

これは、問題に対して非常にクリーンなソリューションです。

11
Henrique Rocha

遅すぎますが、問題が誰かに役立つかもしれません。これは、これが私のコードサンプルのように、カテゴリの子のみのアイコンを追加できることです。画面にはテキスト編集アイコンのみが表示されます。

<?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>

結果:

enter image description here

5
mehmet

おかげで:

以下は私のために働きました:

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>

以下の適切なサイズのアイコン:

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

私は、PreferenceActivityがメインアクティビティであり、各カスタム設定にアイコンを追加したいアプリを作成しています。この画像のように:

それはPreferenceActivityではありません。

PreferenceScreenにアイコンを追加するにはどうすればよいですか?

たまたま設定を保存する独自のアクティビティを作成する方が簡単です。

個人的には、アイコンをスキップして、通常のPreferenceScreenおよびPreferenceActivityシステムを使用します。

1
CommonsWare

{text and icon}を含むlistpreferenceが必要な場合は、これを見ることができます listpreference with icons

0
tm1701

「健全な」回答の場合は、Henrique Rochaによって説明されている9パッチ方法を使用するか、次の方法を使用できます。

EditTextPreferenceを拡張する新しいPreferenceクラスを作成し、onCreateViewをオーバーライドします。

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

    return v;
}

Iconpreferenceと呼ばれる新しいレイアウトXMLを作成し、このXMLに標準の設定レイアウトを含めることができます。基本的に、好きなように微調整できます。簡単な例:

    <?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>

それで全部です!

0
JanCor