2012-05-09 4 views
2

Привет, я хочу добавить кнопку в prefrencescreen, я получил успех, добавив кнопку в prefrence, но я не смог получить событие onClick. я прилагаю мой код ПИК экрана prefenceДобавить кнопку в PrefrenceScreen: Android

setting.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> 

settingdetail.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" /> 

и OnCreate Метод prefenceActivity класса

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

} 

скриншот

enter image description here

+0

Дайте Тост, как, как это и попробовать once.Toast.makeText (Setting.this, "TEST", Toast.LENGTH_SHORT) .show (); – user1213202

+0

Есть ли у кнопки btn какое-то значение. У вас отлажено это? – NitZRobotKoder

+0

Кнопка имеет идентификатор, но я не мог получить onClick. – hchouhan02

ответ

0

Вместо того чтобы использовать обработчик OnClick(), переопределить метод onPreferenceTreeClick в вашем PreferenceActivity. Там вы получите объект предпочтения с кликом, и вы можете проверить его ключ.

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 

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

return false; 
} 
+0

Можете ли вы дать мне пример этого. – hchouhan02

+0

u можете попробовать PreferenceClickListener mBuyPrefernce.setOnPreferenceClickListener (это); – NitZRobotKoder

2

Реализовать OnPreferenceClickListener в preferenceActivity

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

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

    try { 
     //Do Something 
    } 

    return false; 
} 

U ¨R сделано;)

+0

Отметьте answere, если Полезно;) – NitZRobotKoder

+1

, но это нажимает на строку, но я хочу получить событие click на кнопке только. – hchouhan02

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> 

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

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

Add a button in Preference Row

5

Эта нить несвежая, но так как нет никакого решения еще, вот как мне удалось:

1. Установите кнопку нажми слушатель

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

Программное: В пользовательском предпочтении, переопределить 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, как описано здесь: Responding to Click Events

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. Приложить макет

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

0

Вместо

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

сделать

Button btn = (Button)typePref.getView(view, viewGroup); 
Смежные вопросы