У меня есть PreferenceScreen, созданный с помощью пользовательского ListPreference и CheckBoxPreference. Это XML с именем «pref_screen_custom.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>
.java для PreferenceScreen с именем PrefCustom002Activity.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);
}
}
И класс, который расширяет ListPreference, называется Prefs002.java:
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, состоящий из LinearLayout, который содержит представление, которое создает сам ListPreference, плюс новую кнопку, которая размещается справа от Представление, созданное ListPreference. Графически это работает, НО, если я нажму на этот новый вид, диалоговое окно настроек не будет отображаться (также, когда вы нажимаете на него, строка не меняется на желтый цвет, но я могу это исправить, добавив TouchListener). Кроме того, согласно документации, если я переопределяю OnCreateView, я должен установить «widget_frame» в новое представление, и я сделал это в строке newLayoutParent.setId(android.R.id.widget_frame);
, но это не приводит к появлению диалогового окна, когда я нажимаю это представление.
Итак, как я могу вызвать диалог этого пользовательского ListPrerence?
Заранее спасибо.