Add buttons to PreferenceFragment

14,670

Solution 1

I meet the same question, and I found a way to handle this issue.

Overwrite the method onCreateView in PreferenceFragment, using the given the LayoutInfalter by parameters to create your own View, and return this view.

It's my code. I hope this can be helpful

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        View v = inflater.inflate(R.layout.set_alarm, null);

        Button save = (Button)v.findViewById(R.id.save);
        Button revert = (Button)v.findViewById(R.id.revert);
        Button delete = (Button)v.findViewById(R.id.delete);

        save.setOnClickListener(this);
        revert.setOnClickListener(this);
        delete.setOnClickListener(this);

        if(mId == -1){
            delete.setEnabled(false);
        }

        return v;
    }

Solution 2

I modified the previous post a little bit, so that the button will get attached at the bottom of the view.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        LinearLayout v = (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);

        Button btn = new Button(getActivity().getApplicationContext());
        btn.setText("Button on Bottom");

        v.addView(btn);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            }
        });

        return v;
    }

Solution 3

Just create your own layout for the settings activity which contains list view with id @android:id/list

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fragment"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp">
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

    <Button
        android:id="@+id/button"
        android:text="Save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

And then in the activity class set the content view before adding preference fragment

public class SettingsActivity extends Activity {

    @Override
    public void onCreate( Bundle savedInstanceState) {    
        super.onCreate( savedInstanceState);
        setContentView(R.layout.settings_activity)

        // load up the preferences fragment
        getFragmentManager().beginTransaction().replace( android.R.id.content, new PrefsSettingsFragment()).commit();
    }
}

Solution 4

you may try this

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            LinearLayout v = (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);

            Button SendLogbtn = new Button(getActivity().getApplicationContext());
            SendLogbtn.setText("send log file");

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);

            params.setMargins(100, 0, 0, 500);
            SendLogbtn.setLayoutParams(params);

            v.addView(SendLogbtn);

            SendLogbtn.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    // do your code 

                }
            });

            return v;
        }
Share:
14,670
Namaste
Author by

Namaste

Updated on June 04, 2022

Comments

  • Namaste
    Namaste about 2 years

    I want to add a couple buttons to the bottom of my preferences screen for setting defaults and restoring defaults. This answer doesn't cover how to do this using PreferenceFragment. What is the recommended way to accomplish this.

    Activity that loads the preferences fragment:

    public class SettingsActivity extends Activity {
    
        @Override
        public void onCreate( Bundle savedInstanceState) {
    
            super.onCreate( savedInstanceState);
    
            // load up the preferences fragment
            getFragmentManager().beginTransaction().replace( android.R.id.content, new PrefsSettingsFragment()).commit();
        }
    }
    

    PreferenceFragment implementation:

    public class PrefsSettingsFragment extends PreferenceFragment {
    
        @Override
        public void onCreate( Bundle savedInstanceState) {
    
            super.onCreate( savedInstanceState);  
    
            addPreferencesFromResource( R.xml.preferences);             
        }       
    }
    

    preferences.xml:

    <?xml version="1.0"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    
        <EditTextPreference android:key="edit_text_preference_server_address" android:title="@string/preference_server_address"/>
        <SwitchPreference android:key="switch_preference_bat" android:title="@string/preference_bat"/>
        <SwitchPreference android:key="switch_preference_comm" android:title="@string/preference_comm"/>
        <SwitchPreference android:key="switch_preference_dev_mode" android:title="@string/preference_dev_mode" android:defaultValue="true"/>
    
    </PreferenceScreen>
    
  • knarf
    knarf about 6 years
    Overiding (via the IDE, slightly different method signature) the onCreateView in the PreferenceFragment subclass worked for me.
  • rdehuyss
    rdehuyss about 5 years
    Is the button clickable? My onClickListener is not fired in this case...