#android #android-layout #android-preferences
#Android #android-макет #android-настройки
Вопрос:
У меня есть список действий, при нажатии на одно из которых я получу список.
В этом списке я могу применить настройки с помощью кнопки меню. Но эти настройки не применяются сразу к ListView.
Я должен вернуться назад и пройти свой путь по родительскому списку действий, и когда я нажимаю, применяются только те настройки, которые я хочу. не можем ли мы применить эти настройки / настройки сразу после их применения?
Ответ №1:
Но представление, которое я применяю, выполняется с помощью cursoradapter. Когда я помещаю этот курсор в OnSharedPreferenceChangeListener, он выдает мне некоторую ошибку конструктора «Конструктор MyCountriesActivity.MySimpleCursorAdapter(новые общие настройки.OnSharedPreferenceChangeListener(){}, int, курсор, строка[], int[]) не определено «. Я попытался соответствующим образом настроить конструктор в MySimpleCursorAdapter, но я не могу этого сделать. Каково решение?
OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// Implementation
int sort = prefs.getInt("sort_pref", -1); // -1 will be the result if no preference was set before
if(sort == 1)
sortOrder = "year";//sort on year
else if (sort == 2)
sortOrder = "country";//sort on country
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(CONTENT_URI, null, null, null, sortOrder);
String[] from = new String[] { "year", "country" };
int[] to = new int[] { R.id.year, R.id.country };
SimpleCursorAdapter sca = new MySimpleCursorAdapter(this, R.layout.country_row,
c, from, to);
setListAdapter(sca);
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
}
class MySimpleCursorAdapter extends SimpleCursorAdapter{
public MySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
// TODO Auto-generated constructor stub
}
@Override // Called when updating the ListView
public View getView(int position, View convertView, ViewGroup parent) {
/* Reuse super handling ==> A TextView from R.layout.list_item */
View v = super.getView(position,convertView,parent);
TextView tYear = (TextView) v.findViewById(R.id.year);
TextView tCountry = (TextView) v.findViewById(R.id.country);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean font_size = prefs.getBoolean("fontSize", false);
boolean italic_font = prefs.getBoolean("fontItalic", false);
String listpref = prefs.getString("bgColor", "#ffffff80");
//System.out.println(listpref);
tYear.setBackgroundColor(Color.parseColor(listpref));
tCountry.setBackgroundColor(Color.parseColor(listpref));
if (font_size){
tYear.setTextSize(25);
tCountry.setTextSize(25);
}
if (italic_font){
tYear.setTypeface(null, Typeface.ITALIC);
tCountry.setTypeface(null, Typeface.ITALIC);
}
return v;
}
}
Комментарии:
1. Что ж, прочитайте сообщение об ошибке. В этой строке:
SimpleCursorAdapter sca = new MySimpleCursorAdapter(this, R.layout.country_row, c, from, to);
вы создаете новый MySimpleCursorAdapter сthis
первым аргументом. В этом случае «This» является слушателем, и ваш конструктор не требуетOnSharedPreferenceChangeListener
.2. Я не понял вашу точку зрения. У меня уже есть MySimpleCursorAdapter с конструктором, который я использую для других целей, кроме этого OnSharedPreferenceChangeListener. Теперь, когда я пытаюсь использовать тот же mysimplecursoradapter, я не могу исправить проблему с ошибкой конструктора
3. Посмотрите на конструктор MySimpleCursorAdapter. Первый аргумент предназначен для a
Context
. В строке, которую я указал, у вас естьthis
первый аргумент. Однакоthis
это неContext
объект. Попробуйте заменить его одним изget*Context()
методов.4. да, когда я использовал первый аргумент в качестве getContext(), это сработало, спасибо за это. но все же у меня есть одна проблема. настройки хорошо работают с флажками, но не с listpreferences. когда я выбираю одно из предпочтений списка, оно не работает, а затем флажки после этого также не работают. когда я возвращаюсь к основному списку и просматриваю этот список, ссылки также показывают эффект, но не сразу. для listprefernces[String listpref = prefs.getString(«bgColor», «#ffffff80″);] также для моих массивов [<string-array name=»список»>] и [<string-array name=»listValues»>] и
5. Трудно сказать, что происходит без какого-либо реального кода. Возможно, вы захотите отметить ответ на этот вопрос, как это было в отношении автоматической настройки префиксов. Что касается вашей новой проблемы, вы можете захотеть сохранить цвета как
int
, например0xff000000
, а неString
Ответ №2:
Вы можете добавить OnSharedPreferenceChangeListener
в свою активность:
public class MyList extends ListActivity implements OnSharedPreferenceChangeListener {
и определите onSharedPreferenceChange()
метод для немедленного изменения настроек вручную. Вам SharedPreferences.registerOnSharedPreferenceChangeListener(this)
также придется использовать.
Комментарии:
1. Но представление, которое я применяю, осуществляется через пользовательский cursoradapter, который расширяет cursoradapter в onCreate. У меня есть некоторая идея, что я должен написать OnSharedPreferenceChangeListener в моем Oncreate, но как я могу это сделать. Мой адаптер курсора находится в onCreate.
Ответ №3:
OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
int sort = prefs.getInt("sort_pref", -1); // -1 will be the result if no preference was set before
if(sort == 1)
sortOrder = "year";//sort on year
else if (sort == 2)
sortOrder = "country";//sort on country
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(CONTENT_URI, null, null, null, sortOrder);
String[] from = new String[] { "year", "country" };
int[] to = new int[] { R.id.year, R.id.country };
SimpleCursorAdapter sca = new MySimpleCursorAdapter(getBaseContext(), R.layout.country_row,
c, from, to);
setListAdapter(sca);
//System.out.println("sjfs");
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);