Cómo agregar un botón a PreferenceScreen

¿Hay alguna manera de agregar un botón en la parte inferior de la pantalla de preferencias y hacer que funcionen correctamente al desplazarse?

Hay otra solución para personalizar la apariencia de las preferencias.

Diseña un diseño XML normal con botones o lo que quieras agregar a las preferencias estándar. Incluye un ListView en tu diseño y dale el ID @android:id/list .

Digamos que llamamos al archivo de diseño res/layout/main.xml . Podría verse algo como esto:

      

En su actividad de PreferenceActivity , agregue estas dos líneas a su onCreate :

 addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.main); 

El ListView en su diseño será reemplazado por las preferencias definidas de la manera habitual en res/xml/preferences.xml .

Sé que esto es un poco tarde, pero acabo de encontrar una solución que me gusta más que la elogiada solución de Max.

Simplemente puede agregar un pie de página (o si le gusta el botón para estar en la parte superior, un encabezado) a ListView de PreferenceActivity como sigue:

 public class MyActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); ListView v = getListView(); v.addFooterView(new Button(this)); } } 

Espero que esto ayude a alguien.

Este ejemplo a continuación mostrará un botón en la parte inferior de la página (en caso de que alguien aún esté interesado).

En caso de LinearLayout, también puede aplicar pesos; esto es necesario porque Listview está configurado a * fill_parent *. Normalmente hago esto agregando * android: layout_weight * ‘s:

     

La explicación a continuación no es propintamente 100% pero te ayudará a entender …

 +-- View Port (linear layout) | +-- List View (this is where the preferences will go) | | | | | +-- +-- +-- | Button (which was pushed out of view by the fillparent of ListView +-- 

También podría decir, porque el botón no tiene peso; el botón se representa a 0dp de altura.

Ahora con el layout_weigths agregado, dejará que el botón se visualice

 +-- View Port (linear layout) | +-- List View (this is where the preferences will go) | | | | | +-- | +-- | | Button (which was pushed out of view by the fillparent of ListView | +-- +-- 

En realidad, hay una solución. Aquí hay un código, espero, esto será útil para cualquier persona. Parece que hay 3 opciones y 2 botones en la parte inferior de la pantalla, independientemente de la resolución de la pantalla (el objective fue 240 como el más bajo)

 package com.myapplication.gui; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.view.Display; import android.view.Gravity; import android.view.WindowManager; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ScrollView; import com.myproject.general.HeightListView; import com.myapplication.R; public class FilterActivity extends PreferenceActivity { private LinearLayout rootView; private LinearLayout buttonView; private Button buttonDone; private Button buttonRevert; private ListView preferenceView; private LinearLayout gradientView; private ScrollView scrollRoot; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int height = display.getHeight(); int width = height > 240 ? display.getWidth() : display.getWidth() - 4; scrollRoot = new ScrollView(this); scrollRoot.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); rootView = new LinearLayout(this); rootView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); rootView.setOrientation(LinearLayout.VERTICAL); buttonView = new LinearLayout(this); buttonView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); buttonView.setOrientation(LinearLayout.HORIZONTAL); buttonView.setGravity(Gravity.BOTTOM); gradientView = new LinearLayout(this); gradientView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); gradientView.setOrientation(LinearLayout.HORIZONTAL); gradientView.setBackgroundResource(R.drawable.gradient); gradientView.setPadding(0, 5, 0, 0); gradientView.setBackgroundResource(R.drawable.gradient); buttonDone = new Button(this); buttonDone.setText(R.string.filterButton_Done); buttonDone.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT)); gradientView.addView(buttonDone); buttonRevert = new Button(this); buttonRevert.setText(R.string.filterButton_Revert); buttonRevert.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT)); gradientView.addView(buttonRevert); buttonView.addView(gradientView); preferenceView = new HeightListView(this); preferenceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); preferenceView.setId(android.R.id.list); PreferenceScreen screen = createPreferenceHierarchy(); screen.bind(preferenceView); preferenceView.setAdapter(screen.getRootAdapter()); rootView.addView(preferenceView); rootView.addView(buttonView); if (height > 240) { this.setContentView(rootView); } else { scrollRoot.addView(rootView); this.setContentView(scrollRoot); } setPreferenceScreen(screen); } private PreferenceScreen createPreferenceHierarchy() { PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this); PreferenceScreen pref1 = getPreferenceManager().createPreferenceScreen(this); pref1.setKey("pref1"); pref1.setTitle("Title"); pref1.setSummary("Summary"); root.addPreference(pref1); PreferenceScreen pref2 = getPreferenceManager().createPreferenceScreen(this); pref2.setKey("pref2"); pref2.setTitle("Title"); pref2.setSummary("Summary"); root.addPreference(pref2); PreferenceScreen pref3 = getPreferenceManager().createPreferenceScreen(this); pref3.setKey("pref3"); pref3.setTitle("Title"); pref3.setSummary("Summary"); root.addPreference(pref3); return root; } } 

Este sería el aspecto del código en la actividad en el ejemplo de Ronny. Mi intención era poner un menú en la parte inferior de la pantalla.

 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.prefs); addPreferencesFromResource(R.xml.prefs); /* LayoutInflater CX = getLayoutInflater(); CX.inflate(R.layout.main,null);*/ // TODO Auto-generated method stub } 
      

Hago referencia a @Ronnie, uso RelativeLayout y establezco un alto para layout_height de listview, y luego configuro el botón layout_alignParentBottom = “true”, puede mostrar un botón en la parte inferior de PreferenceScreen; luego usa el camino de @Max. funciona para mis necesidades

También es posible agregar botones de Acción a la barra de acción para un enfoque estándar de Android.

 public class PrefActivity extends PreferenceActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.preference_header_menu, menu); return super.onCreateOptionsMenu(menu); } }     

Solo necesita usar PreferenceFragment dentro de Activity general y agregar el botón en el diseño de la actividad.

 public class SettingActivity extends Activity { UserProfileViewModel userProfileViewModel = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); getFragmentManager().beginTransaction() .replace(R.id.content, new SettingsFragment()) .commit(); } private class SettingsFragment extends PreferenceFragment { public SettingsFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.pref_main); } } } 

SettingActivity.java

      

activity_setting

enter image description here

Vista personalizada en Actividad de preferencia esto ayudará a agregar vista personalizada en PreferenceActivity en Android.

Crea main.xml, la única vista necesaria es un ListView, con id: android:id="@android:id/list" .

       

Crear CustomPreferenceActivity.java

 public class CustomPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); addPreferencesFromResource(R.xml.settings); //setup any other views that you have TextView textView = (TextView) findViewById(R.id.textView); textView.setText("View Added"); } } 

La siguiente es una solución simple para agregar un botón que se puede hacer clic en su pantalla de preferencias. Esto es más fácil porque las preferencias ya reservan el espacio en el android: widgetLayout y el botón puede pasar clics con android: onClick.

Primero crea un button.xml con el contenido

     

Ahora en su preferences.xml, agregue la preferencia

  

Su PreferenceActivity ahora solo debe contener un miembro onButtonClick

 public class MainActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.main_preferences); } public void onButtonClick(View v) { Log.d("Button", "Yeah, button was clicked"); } } 

preferences.xml:

    

SettingsFragment.java:

 public class SettingsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); Preference clearAllData = (Preference) findPreference("clearAllData"); // setup buttons final Context context = getActivity(); clearAllData.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { ... } } }