studio recorrer preferencias preferencia pantalla nombre ejemplo editar crear configuracion cambiar archivos archivo android android-preferences

android - recorrer - Cómo agregar un botón a PreferenceScreen



recorrer sharedpreferences (10)

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

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


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:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="10"/> <Button android:text="This is a button on top of all preferences." android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/> </LinearLayout>

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 | +-- +--


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 }


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:

<?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"> <Button android:text="This is a button on top of all preferences." android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>

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 .


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

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="BUTTON" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/button" android:onClick="onButtonClick"/> </LinearLayout>

Ahora en su preferences.xml, agregue la preferencia

<Preference android:key="button" android:title="Title" android:summary="Summary" android:widgetLayout="@layout/button" />

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


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.


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

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/buttonSave"/> <Button android:id="@+id/buttonSave" android:text="Save" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>

activity_setting


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); } } <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_add" android:icon="@drawable/ic_menu_add_dark" android:title="@string/menu_action_add_title" android:showAsAction="always" /> </menu>


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" .

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <ListView android:id="@android:id/list" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="0dp"> </ListView> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>

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


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="@dimens/listview_height" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="This is a button on top of all preferences." /> </RelativeLayout>

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