2012-05-09 62 views
2

嗨,我想添加一個按鈕到prefrencescreen,我成功地添加了一個按鈕到prefrence,但我無法得到onClick事件。我重視我的代碼prefence屏幕的PIC在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" /> 

和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

按鈕有ID,但我無法獲得onClick。 – hchouhan02

回答

0

除了使用的onClick()處理的,覆蓋在你的PreferenceActivity的onPreferenceTreeClick方法的onCreate方法。在那裏你會得到點擊偏好對象,你可以檢查它的關鍵。

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 

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

return false; 
} 
+0

你能給我一個例子。 – hchouhan02

+0

你可以嘗試PreferenceClickListener mBuyPrefernce。setOnPreferenceClickListener(本); – NitZRobotKoder

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

üR來;)

+0

馬克answere如果有用;) – NitZRobotKoder

+1

但這是點擊行,但我想獲得點擊事件按鈕只。 – 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); 
} 

通過XML:添加android:onClick="yourMethodName"Button元素的佈局定義(這是佈局的一部分你的偏好,見下文),並在你的PreferenceActivity如下所述實施該方法:Responding to Click Events

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"或者在您在PreferenceFragment中構建首選項時,通過setLayoutResource進行設置。

0

而不是

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

做到這一點

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