Custom PreferenceScreen with clickable buttons

2019-01-28 05:29发布

问题:

I have created following Custom Preference Screen.

I want to add Listener on Button1 and Button2. How should I do it?

I am using following code for creating above Preference Screen.

DemoPref:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class DemoPref extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startActivity(new Intent(this, MyPref.class));
    }
} 

MyPref:

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyPref extends PreferenceActivity{
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        //setContentView(R.layout.tftp_setting);
        this.addPreferencesFromResource(R.xml.list_pref);
        /*Button b1 = (Button)findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                Log.i("MyPref", "Button1 one is clicked.");
            }           
        });

        Button b2 = (Button)findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                Log.i("MyPref", "Button2 one is clicked.");
            }           
        });*/
    }
}

res\layout\setting.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
   android:orientation="vertical"
  >
  <LinearLayout  android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">

    <TextView android:text="TextView1" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:text="EditText2" android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>

  </LinearLayout>

  <LinearLayout  android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">

    <TextView android:text="TextView2" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:text="EditText2" android:id="@+id/editText2" android:layout_height="wrap_content" android:layout_width="wrap_content"></EditText>

  </LinearLayout>

   <LinearLayout  android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">

    <Button android:text="Button1" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Button android:text="Button2" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

   </LinearLayout>
</LinearLayout>

res\xml\pref.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">

 <PreferenceScreen  android:title="My Setting"  android:layout="@layout/setting" android:summary="This is my setting."></PreferenceScreen>

</PreferenceScreen>

回答1:

You need:

Button b1 = (Button) findViewById(R.id.button1);
Button b2 = (Button) findViewById(R.id.button2);

b1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Log.i("MyPref", "Button1 one is clicked.");
    }
});

b2.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Log.i("MyPref", "Button2 one is clicked.");
    }
});


回答2:

I don't have an answer but have some insight -

The view in which you are trying to find the buttons is NOT settings.xml (or pref.xml) - that's why findViewById returns null.

I think the view (layout) which is loaded is internal Android OS view, with ID 17367111 (or 0x1090047).

The only preference you have in the PreferenceScreen you open is another PreferenceScreen (which uses the settings.xml as layout)

you need to get access to the view of this internal PreferenceScreen and them you'd be able to do:

prefScreeView.findViewByID(R.id.button1);

Hope it helps someone to find the answer.



回答3:

Button btn = (Button) getPreferenceScreen().findPreference(key);