Общие настройки не применяются сразу

#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);