2

こんにちは、ボタンを prefrencescreen に追加したいのですが、ボタンを prefrence に追加することに成功しましたが、onClick イベントを取得できませんでした。私は自分のコードに好みの画面の写真を添付し​​ました

設定.xml

<PreferenceCategory android:title="Application Details">

    <Preference android:key="type" 
                android:title="Type"
                android:summary="" />

</PreferenceCategory>

<PreferenceCategory android:title="Notification Settings">

    <ListPreference android:key="sendNotificationType"
                    android:title="Status Notification For"
                    android:dialogTitle="Status Notification For" />

</PreferenceCategory>

設定詳細.xml

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/textView2"
    android:layout_marginLeft="15dp"
    android:text="Type"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView1"
    android:layout_marginLeft="15dp"
    android:layout_toLeftOf="@+id/setFromTimeBtn"
    android:text="Summary"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<Button
    android:id="@+id/buyItNowBtn"
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:layout_alignParentRight="true"
    android:layout_marginRight="15dp"
    android:layout_centerVertical="true"
    android:background="@drawable/button"
    android:text="@string/buyItNowBtnTxt"
    android:textColor="@color/white" />

および prefenceActivity クラスの onCreate メソッド

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.layout.setting);
    setContentView(R.layout.settingview);

    Preference typePref = (Preference) findPreference("type");
    typePref.setLayoutResource(R.layout.settingdetail);
typePref.setSelectable(true);

    Button btn = (Button) findViewById(R.id.buyItNowBtn);
    btn.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        Log.e(TAG,"TEST");
        Toast.makeText(Setting.this, "TEST", Toast.LENGTH_SHORT).show();
    }
});

}

スクリーンショット

ここに画像の説明を入力

4

5 に答える 5

5

このスレッドは古くなっていますが、まだ解決策がないため、成功した方法は次のとおりです。

1. ボタンクリックリスナーを設定する

ボタンのクリック リスナーを設定するには、プログラムまたは XML の 2 つの方法があります。

プログラムによる:カスタム設定で、リスナーをオーバーライドonBindViewしてアタッチします。

@Override
protected void onBindView(View view) {
    View button = view.findViewById(R.id.myButton);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.d(LOG_TAG, "button click listener works!");
        }
    });
    super.onBindView(view);
}

XML 経由:android:onClick="yourMethodName"要素のレイアウト定義Button(お好みのレイアウトの一部です。以下を参照) に追加し、ここで説明されているようにメソッドを実装します:PreferenceActivityクリックイベントへの応答

2. OnPreferenceClickListener を修正する

これで、ボタン クリック リスナーは機能するはずですが、プリファレンスOnPreferenceClickListenerは機能しなくなります。これを修正するには、追加します

android:descendantFocusability="blocksDescendants"

お好みでレイアウトファイルの一番上の要素に:

<LinearLayout 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:paddingEnd="?android:attr/scrollbarSize"
    android:background="?android:attr/selectableItemBackground"
    android:descendantFocusability="blocksDescendants">

    <ImageView
        android:id="@android:id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dip"
        android:layout_marginEnd="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_alignStart="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

        <Button android:id="@+id/myButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical" />
</LinearLayout>

android:onClick="yourMethodName"(プログラムで行うことを選択したため、ここではいいえ。)

3. レイアウトを貼り付ける

最後に、このレイアウトを好みの XML ファイルに設定する必要がありandroid:layout="@layout/myLayoutName"ます。setLayoutResourcePreferenceFragment

于 2014-11-18T12:46:48.140 に答える
2

preferenceActivity に OnPreferenceClickListener を実装する

private Preference mBuyPreference = null;
mLogoutPreference = findPreference(yourkey);
mBuyPreference.setOnPreferenceClickListener(this);

@Override
public boolean onPreferenceClick(Preference preference) {
if (preference == mBuyPreference) {

    try {
        //Do Something
    }

    return false;
}
于 2012-05-09T10:43:37.783 に答える
0

このようなカスタム設定を作成することで、問題の半分を解決しました-

これに到達するために、次のようなカスタム設定を作成しました-

public class CustomPreference extends Preference {

private LinearLayout mWidgetContainer;
private View mRowView;

public CustomPreference(Context context) {
    super(context);
}

public CustomPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected View onCreateView(ViewGroup parent) {
    LayoutInflater viewInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mRowView = viewInflater.inflate(R.layout.preferences_row_view, parent, false);

    mWidgetContainer = (LinearLayout) mRowView.findViewById(android.R.id.widget_frame);

    Button button = new Button(getContext());
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

    button.setLayoutParams(params);
    button.setBackgroundResource(R.drawable.listview_row_bg);
    button.setTextSize(14);
    button.setPadding(5, 5, 5, 5);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getContext(), BuyScreenActivity.class);
            getContext().startActivity(intent);
        }
    });
    button.setTypeface(null, Typeface.BOLD);
    button.setText("Buy now");
    mWidgetContainer.addView(button);

    return mRowView;
}
}

次に、設定xmlファイルで次のような設定を作成できます

<package.of.your.java.file.CustomPreference 
    android:key="type" 
    android:title="Type"
    android:summary="" />

そして私のpreferences_row_view.xmlは

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="50dip"
    android:paddingLeft="5dip"
    android:paddingRight="?android:attr/scrollbarSize" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="6dip"
        android:layout_marginRight="6dip"
        android:layout_marginTop="6dip"
        android:layout_weight="1" >

        <TextView
            android:id="@+android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="2"
            android:lineSpacingMultiplier="1.3"
            android:textSize="14sp" />

        <TextView
            android:id="@+android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@android:id/title"
            android:layout_below="@android:id/title"
            android:maxLines="4"
            android:textSize="13sp" />
    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->

    <LinearLayout
        android:id="@+android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center_vertical"
        android:orientation="horizontal" />

</LinearLayout>

それでいい。

しかし、私が直面しているもう 1 つの問題があり、SO にここに投稿しました。

プリファレンス行にボタンを追加する

于 2013-01-07T11:32:27.753 に答える
0

それ以外の

 Button btn = (Button) findViewById(R.id.buyItNowBtn);

これを行う

  Button btn = (Button)typePref.getView(view, viewGroup );
于 2016-01-19T04:50:24.753 に答える
0

onClick() ハンドラーを使用する代わりに、PreferenceActivity で onPreferenceTreeClick メソッドをオーバーライドします。そこでクリックした設定オブジェクトを取得し、そのキーを確認できます。

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

 if (preference.getKey().equals("key")) {           
       // do something
       return true;
 }

 return false;
}
于 2012-05-09T10:30:13.063 に答える