Вопрос по android – Добавить кнопку в PrefrenceScreen: Android

2

Привет, я хочу добавить кнопку в экран настроек, я успешно добавил кнопку в настройку, но не смог получить событие onClick. я прикрепил свой код к картинке с защитным экраном

setting.xml

<code><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>
</code>

settingdetail.xml

<code><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" />
</code>

и метод onCreate класса prefenceActivity

<code>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();
    }
});

}
</code>

screenshot

enter image description here

я не мог получить БТН. это дает мне NullPointerException в этой строке btn.setOnClickListener (new OnClickListener () hchouhan02
Попробуйте следующим образом..btn.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View v) {// Заглушка автоматически сгенерированного метода TODO}}); NitZRobotKoder
Имеет ли кнопка btn какое-то значение? NitZRobotKoder
Кнопка имеет идентификатор, но я не могу получить OnClick. hchouhan02
Дайте Toast как это и попробуйте один раз. Toast.makeText (Setting.this, & quot; TEST & quot ;, Toast.LENGTH_SHORT) .show (); user1213202

Ваш Ответ

5   ответов
0

создав пользовательские настройки, например:

Чтобы добраться до этого, я создал собственное предпочтение, подобное этому -

public class CustomPreference extends Preference {

private LinearLayout mWidgetContainer;
private View mRowView;

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

public CustomPreference(Context context, AttributeSet att,rs) {
    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="" />

И мои предпочтения_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>

Что будет делать.

Но есть еще одна проблема, с которой я сталкиваюсь, которую я разместил здесь на SO.

Добавить кнопку в строке предпочтений

5

но поскольку решения пока нет, вот как мне это удалось:

1. Set the button click listener

Есть два способа установить прослушиватель щелчка для кнопки, программно или через XML.

Programmatically: В ваших пользовательских настройках переопределите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);
}

Via XML: добавлятьandroid:onClick="yourMethodName" к определению макетаButton элемент (который является частью макета для вашего предпочтения, см. ниже) и реализовать метод в вашемPreferenceActivityкак описано здесь:Отвечая на события кликов

2. Fix 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. Attach the Layout

Наконец, вам нужно установить этот макет для вашего предпочтительного XML-файла: добавлятьandroid:layout="@layout/myLayoutName" или в качестве альтернативы установить его черезsetLayoutResource как вы строите предпочтение в вашемPreferenceFragment.

0

ferenceTreeClick в своей PreferenceActivity. Там вы получите выбранный объект предпочтений и можете проверить его ключ.

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

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

 return false;
}
Вы можете попробовать PreferenceClickListener mBuyPrefernce.setOnPreferenceClickListener (this);
Можете ли вы дать мне пример этого. hchouhan02
2

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

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

    try {
        //Do Something
    }

    return false;
}
Отметьте ответ, если он полезен;)
но это по щелчку на строке, но я хочу, чтобы получить событие щелчка только по кнопке. hchouhan02
0

Вместо

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

сделай это

  Button btn = (Button)typePref.getView(view, viewGroup );

Похожие вопросы