カスタムListPreferenceとCheckBoxPreferenceで作成されたPreferenceScreenがあります。これは「pref_screen_custom.xml」と呼ばれるXMLです。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- My custom preference type. This just replaces the actual widget
portion of the preference, if the whole preference wanted to be
replaced we would use the layout attribute instead of the widgetLayout
attribute. -->
<com.pref_002.Pref002
android:key="my_preference"
android:title="Title: Pref002"
android:summary="Summary: summary"
android:defaultValue="-1"
android:entries="@array/pref002_list_ent"
android:entryValues="@array/pref002_list_vals"
android:dialogTitle="title" />
<CheckBoxPreference
android:key="advanced_checkbox_preference"
android:title="Title: checkbox preference"
android:summaryOn="On checkbox"
android:summaryOff="Off checkBox" />
</PreferenceScreen>
プリファレンスの配列を保持するXMLは(array.xml)です。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="pref002_list_ent">
<item>T</item>
<item>V</item>
<item>S</item>
</string-array>
<string-array name="pref002_list_vals">
<item>10</item>
<item>8</item>
<item>6</item>
</string-array>
</resources>
PrefCustom002Activity.javaと呼ばれるPreferenceScreenの.javaは次のとおりです。
package com.pref_002;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class PrefCustom002Activity extends PreferenceActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_screen_custom_001);
}
}
そして、「Prefs002.java」と呼ばれるListPreferenceを拡張するクラスは次のとおりです。
package com.pref_002;
import android.content.Context;
import android.preference.ListPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
public class Pref002 extends ListPreference
{
// Constructor called by the inflater
public Pref002(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected View onCreateView(ViewGroup parent)
{
// New Layout that will contain the default loaded View from ListPreference
// plus a new one (a Button)
LinearLayout newLayoutParent = new LinearLayout(getContext());
newLayoutParent.setOrientation(LinearLayout.HORIZONTAL);
newLayoutParent.setWeightSum(10.0f);
// get the View returned from ListPreference
View listPreferenceDefaultView = super.onCreateView(parent);
// new layout values for this View
LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params1.weight = 9.0f;
listPreferenceDefaultView.setLayoutParams(params1);
//--Button to be added to newLayoutParent --//
LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params2.gravity = Gravity.CENTER_VERTICAL;
params2.weight = 1.0f;
Button b = new Button(getContext());
b.setText("A button");
b.setLayoutParams(params2);
// add the two views
newLayoutParent.addView(listPreferenceDefaultView);
newLayoutParent.addView(b);
newLayoutParent.setId(android.R.id.widget_frame);
return newLayoutParent;
}
}
したがって、「Prefs002.java」でわかるように、onCreateViewをオーバーライドして、ListPreferenceが作成するビューと、右側に配置される新しいButtonを含むLinearLayoutで構成されるListPreferenceの新しいレイアウトを作成します。 ListPreferenceによって生成されたビュー。グラフィカルにこれは機能しますが、この新しいビューをクリックしても、設定のダイアログは表示されません(クリックしても、行は黄色に変わりませんが、TouchListenerを追加することで修正できます)。また、ドキュメントによると、OnCreateViewをオーバーライドする場合は、「widget_frame」を新しいビューに設定する必要があります。これを行で実行しました newLayoutParent.setId(android.R.id.widget_frame);
が、このビューをクリックしてもダイアログが表示されません。
では、このカスタムListPrerenceのダイアログを呼び出すにはどうすればよいですか?
前もって感謝します。