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