11 ответов:
существует еще одно решение для настройки внешнего вида настроек.
создайте обычный XML-макет с кнопками или все, что вы хотите добавить в стандартные настройки. Включите
ListViewв вашем макете и дать ему идентификатор@android:id/list.допустим, мы называем файл макета
res/layout/main.xml. Это может выглядеть примерно так:<?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" 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="match_parent" android:layout_height="wrap_content" /> </LinearLayout>в своем
PreferenceActivityдобавьте эти две строки в свойonCreate:addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.main);The
ListViewв вашей затем макет будет заменен предпочтениями, определенными обычным способом вres/xml/preferences.xml.
Я знаю, что это немного поздно, но я только что нашел решение, я бы лучше оценил решение Макса.
вы можете просто добавить нижний колонтитул (или если вам нравится, чтобы кнопка была сверху, заголовок) в ListView PreferenceActivity следующим образом:
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)); } }Я надеюсь, что это кому-то поможет.
этот пример ниже будет отображать кнопку в нижней части страницы (в случае, если кто-то все еще заинтересован).
В случае LinearLayout вы также можете применить веса; это необходимо, потому что Listview имеет значение *fill_parent*. Я обычно делаю это, добавляя * 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>объяснение ниже не propbably 100%, но это поможет вам понять...
+-- 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 +--вы также могли сказать, потому что кнопка не имеет веса; кнопка отображается на высоте 0dp.
Теперь с layout_weigths добавил он будет lett кнопку render inview
+-- 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 | +-- +--
на самом деле, решение существует. Вот такой код, надеюсь, это будет полезно для всех. Это выглядит как 3 варианта и 2 кнопки в нижней части экрана, независимо от разрешения экрана (был нацелен на 240 как самый низкий)
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; } }
Это было бы то, что код выглядит как в действии на примере Ронни. Мое намерение состояло в том, чтобы поместить меню в нижней части экрана.
/** 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 }
<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>я ссылаюсь на @Ronnie, использую RelativeLayout и устанавливаю высоту для layout_height listview, а затем устанавливаю layout_alignParentBottom кнопки = "true", он может отображать кнопку в нижней части PreferenceScreen; затем используйте путь @Max. это работает для моих потребностей.
также можно добавить кнопки действий в панель действий для стандартного подхода 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>
вам просто нужно использовать PreferenceFragment внутри общей активности и добавить кнопку в layout деятельности.
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
пользовательский вид в предпочтительном действии это поможет добавить пользовательский вид в PreferenceActivity в Android.
создать main.xml, единственное необходимое представление-это ListView, с идентификатором:
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>Создать 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"); } }
ниже приведено простое решение для добавления кликабельной кнопки на экран настроек. Это делается легко, потому что настройки уже зарезервировать место в android:widgetLayout и кнопка может передавать клики с android:onClick.
создать кнопку.XML-файл с содержанием
<?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>Теперь в ваших предпочтениях.xml, добавьте предпочтение
<Preference android:key="button" android:title="Title" android:summary="Summary" android:widgetLayout="@layout/button" />ваш PreferenceActivity теперь должен содержать только элемент 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"); } }
настройки.XML-код:
<Preference android:key="clearAllData" android:title="@string/settings_clear_all_data"> </Preference>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) { ... } } }

Comments