PreferenceActivityを拡張するアプリを作成していて、各Preferenceにアイコンを追加したいと思います。
私は同様の質問を読みました、そしてこれはより評判の良い答えです:
CommonsWare Say:
設定アプリケーションは、プライベートカスタムPreferenceScreenサブクラスを使用してアイコン-IconPreferenceScreenを作成します。コメントを含む51行のコードですが、カスタム属性も必要です。最も簡単なオプションは、それが気に入らなくても、すべてをプロジェクトに複製することです。
しかし、私はそれを機能させることができません。ここでは、クラスIconPreferenceScreenをプロジェクトに複製しました。そして、私はこの後何をしなければならないのか分かりません。新しいIconPreferenceScreenを作成しようとしていますが、機能させることができません。
IconPreferenceScreen test = new IconPreferenceScreen();
test.setIcon(icon);
多くのテストと多くの失敗の後で、私はそれを得ることができました!
私はこれをしなければなりませんでした:
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>
今日はAndroid:icon attrをAPI 11以降で使用できます:)
目的を達成するための最良かつ最も簡単な方法は、アイコンを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パッチなので、アイコンはセルの右端まで透明部分を引き伸ばし、アイコンを左側に配置します。
これは、問題に対して非常にクリーンなソリューションです。
遅すぎますが、問題が誰かに役立つかもしれません。これは、これが私のコードサンプルのように、カテゴリの子のみのアイコンを追加できることです。画面にはテキスト編集アイコンのみが表示されます。
<?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>
結果:
おかげで:
以下は私のために働きました:
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);
}
}
}
私は、PreferenceActivityがメインアクティビティであり、各カスタム設定にアイコンを追加したいアプリを作成しています。この画像のように:
それはPreferenceActivity
ではありません。
PreferenceScreenにアイコンを追加するにはどうすればよいですか?
たまたま設定を保存する独自のアクティビティを作成する方が簡単です。
個人的には、アイコンをスキップして、通常のPreferenceScreen
およびPreferenceActivity
システムを使用します。
{text and icon}を含むlistpreferenceが必要な場合は、これを見ることができます listpreference with icons
「健全な」回答の場合は、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>
それで全部です!