Измененный ListPreference не вызывает свой диалог

У меня есть 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?

Заранее спасибо.


person Pablo    schedule 14.09.2012    source источник


Ответы (1)


Вы можете вызвать диалог, вызвав showDialog() (DialogPreference.showDialog). Когда вы вызываете super.onCreateView, возвращаемое представление уже будет иметь представление с идентификатором widget_frame.

Я бы предложил что-то вроде этого:

View v = super.onCreateView(parent);
View widgetFrame = v.findViewById(android.R.id.widget_frame);
// add/remove stuff into widgetFrame here
return v;
person al.    schedule 14.09.2012
comment
Большое тебе спасибо! Мне просто нужно было вызвать showDialog, и появилось диалоговое окно! - person Pablo; 17.09.2012
comment
Также вы правы насчет widget_frame, он уже установлен на маленький квадрат, который окружает круг со стрелкой, указывающей вниз. Я попробовал View v = super.onCreateView(parent); View widgetFrame = v.findViewById(android.R.id.widget_frame); widgetFrame.setBackgroundColor(0xFF0000FF); и квадрат стал синим. Таким образом, в этом случае нет необходимости устанавливать идентификатор widget_frame. Еще раз спасибо :) - person Pablo; 17.09.2012