1

カスタム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のダイアログを呼び出すにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

0

ダイアログは、showDialog() (DialogPreference.showDialog) を呼び出してトリガーできます。super.onCreateView を呼び出すと、返されるビューには ID widget_frame を持つビューが既に含まれています。

私は次のようなことを提案します:

View v = super.onCreateView(parent);
View widgetFrame = v.findViewById(android.R.id.widget_frame);
// add/remove stuff into widgetFrame here
return v;
于 2012-09-14T18:28:50.753 に答える