Положение счетчика и общие настройки

У меня есть виджет приложения с простым текстовым представлением, которое можно редактировать как поле редактирования текста в конфигурационном действии, с помощью счетчика пользователь может изменить размер текста, мне нужно сохранить выбор счетчиков и снова восстановить с помощью общих настроек, и мне нужен appwidgetid, поэтому пользователь может добавить несколько appwidget.

Я пробовал много вещей и занимался исследованиями в течение 2 дней, но я не могу заставить его работать, я получаю принудительное закрытие, как только виджет добавляется.

Это то, что я думаю, выглядит лучше всего, но это не работает. Выбор счетчика - сохранить в SharedPreferences, затем получить

Это сводит меня с ума! любые предложения по исправлению этого будут ОЧЕНЬ высоко оценены

С уважением Якоб Хартег

Сохранить и загрузить настройки

    // Write the prefix to the SharedPreferences object for this widget
    static void saveTitlePref(Context context, int appWidgetId, String text) {

            SharedPreferences.Editor editor = context.getSharedPreferences(PREFS_NAME, 0).edit();
        editor.putString(PREF_PREFIX_KEY + appWidgetId, text);
        spinner.getSelectedItemPosition();
        editor.putInt(spinnerSelection + appWidgetId, 0);
        editor.commit();
    }

    // Read the prefix from the SharedPreferences object for this widget.
    static String loadTitlePref(Context context, int appWidgetId) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);

            String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);

        spinner.setSelection(prefs.getInt(spinnerSelection + appWidgetId, 0));

        // If there is no preference saved, get the default from a resource
        if (prefix != null) {
            return prefix;
        } else {
            return context.getString(R.string.appwidget_prefix_default);
        }
    }

Почти полный код:

public class WidgetConfig extends Activity implements OnItemSelectedListener{

    Dialog myDialog;
    Context context;
    static EditText info;
    static Spinner spinner;
    private static final String[] paths = { "10", "12", "14", "16", "18", "20",
        "22", "24", "26", "28", "30", "32", "34", "36", "38", "40", "50", "60"};

    File path = null;
    private static final String PREFS_NAME = "com.harteg.NotesWidgetPro.Widget";
    private static final String PREF_PREFIX_KEY = "prefix_";
    private final static String FONT_SIZE_KEY="fontsize";
    static String spinnerSelection;

    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;   

    public WidgetConfig() {
        super();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.widgetconfig);
        context = WidgetConfig.this;

        // back button = cancel
        setResult(RESULT_CANCELED);

        info = (EditText) findViewById(R.id.etwidgetconfig);

        findViewById(R.id.bwidgetconfig).setOnClickListener(mOnClickListener);
        findViewById(R.id.bwidgetconfig1).setOnClickListener(mOnClickListener);

        // Find the widget id from the intent.
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        // If they gave us an intent without the widget id, just bail.
        if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish();
        }

        info.setText(loadTitlePref(WidgetConfig.this, mAppWidgetId));

        //------------ Text Size spinner ---------------
        spinner = (Spinner) findViewById(R.id.TxtSizeSP);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(WidgetConfig.this,
                android.R.layout.simple_spinner_item, paths);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setSelection(7);
        spinner.setOnItemSelectedListener(this);

        //--------------------------------------------------

    } // onCreate finished

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

        switch (position) {
        case 0:
            info.setTextSize(10.0f);
            views.setFloat(R.id.tvConfigInput, "setTextSize", 10);
            break;
        case 1:
            info.setTextSize(12.0f);
            views.setFloat(R.id.tvConfigInput, "setTextSize", 12);
            break;

        ....

        case 17:
            info.setTextSize(28.0f);
            views.setFloat(R.id.tvConfigInput, "setTextSize", 60);
           break;  
        }
        appWidgetManager.updateAppWidget(mAppWidgetId, views);
    }

    public void onNothingSelected(AdapterView<?> arg0) {

    }

    View.OnClickListener mOnClickListener = new View.OnClickListener() {
        public void onClick(View v) {

            // When the button is clicked, save the string in our prefs and
            // return that they clicked OK.
            String titlePrefix = info.getText().toString();
            saveTitlePref(context, mAppWidgetId, titlePrefix);


            // Push widget update to surface with newly set prefix
            AppWidgetManager appWidgetManager = AppWidgetManager
                    .getInstance(context);
            Widget.updateAppWidget(context, appWidgetManager, mAppWidgetId,
                    titlePrefix);

            // Make sure we pass back the original appWidgetId
            Intent resultValue = new Intent();
            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    mAppWidgetId);
            setResult(RESULT_OK, resultValue);
            finish();

        }
    };

    // Write the prefix to the SharedPreferences object for this widget
    static void saveTitlePref(Context context, int appWidgetId, String text) {

        //Getting the SharedPreference object
        SharedPreferences.Editor editor = context.getSharedPreferences(PREFS_NAME, 0).edit();

        // save the values to preferences
        editor.putString(PREF_PREFIX_KEY + appWidgetId, text);

        spinner.getSelectedItemPosition();
        editor.putInt(spinnerSelection + appWidgetId, 0);


        // Saves the values
        editor.commit();
    }

    // Read the prefix from the SharedPreferences object for this widget.
    static String loadTitlePref(Context context, int appWidgetId) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);

        spinner.setSelection(prefs.getInt(spinnerSelection + appWidgetId, 0));

        // If there is no preference saved, get the default from a resource
        if (prefix != null) {
            return prefix;
        } else {
            return context.getString(R.string.appwidget_prefix_default);
        }
    }

    static void deleteTitlePref(Context context, int appWidgetId) {
    }

    static void loadAllTitlePrefs(Context context,
            ArrayList<Integer> appWidgetIds, ArrayList<String> texts) {
    }

...

}

ОБНОВИТЬ:

Я добавил теги журнала следующим образом:

Log.v(TAG, "before save");
        spinner.getSelectedItemPosition();
        editor.putInt(spinnerSelection + appWidgetId, 0);
        Log.v(TAG, "after save");

Log.v(TAG, "before load");
        spinner.setSelection(prefs.getInt(spinnerSelection + appWidgetId, 0));
        Log.v(TAG, "after load");

но они даже не появляются в журнале:

11-16 21:25:08.470: E/AndroidRuntime(1337): FATAL EXCEPTION: main
11-16 21:25:08.470: E/AndroidRuntime(1337): java.lang.RuntimeException: Unable to start receiver com.harteg.NotesWidgetPro.Widget: java.lang.NullPointerException
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2236)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.app.ActivityThread.access$1500(ActivityThread.java:130)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.os.Looper.loop(Looper.java:137)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at java.lang.reflect.Method.invokeNative(Native Method)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at java.lang.reflect.Method.invoke(Method.java:511)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at dalvik.system.NativeStart.main(Native Method)
11-16 21:25:08.470: E/AndroidRuntime(1337): Caused by: java.lang.NullPointerException
11-16 21:25:08.470: E/AndroidRuntime(1337):     at com.harteg.NotesWidgetPro.WidgetConfig.loadTitlePref(WidgetConfig.java:267)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at com.harteg.NotesWidgetPro.Widget.onUpdate(Widget.java:32)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:66)
11-16 21:25:08.470: E/AndroidRuntime(1337):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2229)
11-16 21:25:08.470: E/AndroidRuntime(1337):     ... 10 more

если я удаляю строки для сохранения и загрузки позиции виджет работает идеально

ОБНОВИТЬ:

Я также пробовал с:

Переменная:

private final static String PREF_PREFIX_KEY_FONT_SIZE = "prefix_fontsize_";

Сохранить:

editor.putInt(PREF_PREFIX_KEY_FONT_SIZE + appWidgetId, spinner.getSelectedItemPosition());

загрузить:

prefs.getInt(PREF_PREFIX_KEY_FONT_SIZE + appWidgetId, spinner.getSelectedItemPosition());

дает мне ту же ошибку. пожалуйста помоги


person Jakob    schedule 16.11.2012    source источник
comment
регистрируйте appWidgetId при сохранении и чтении предпочтения, чтобы увидеть, есть ли с ним какие-либо проблемы...   -  person Praful Bhatnagar    schedule 17.11.2012
comment
Обновляю вопрос, спасибо   -  person Jakob    schedule 17.11.2012
comment
@ Сэм, есть ли в моем коде явные сбои?   -  person Jakob    schedule 17.11.2012
comment
Похоже, вы решили это до того, как я получил ваше уведомление, из LogCat я бы предположил, что spinner (или, что менее вероятно, context) было нулевым...   -  person Sam    schedule 17.11.2012
comment
Эй, я думал, что у меня это работает, но теперь размер текста не обновляется в первый раз, я был бы признателен, если бы вы взглянули на него, я разместил новый вопрос: stackoverflow.com/questions/13433211/   -  person Jakob    schedule 17.11.2012


Ответы (1)


у меня все заработало, вот что я сделал

Я отредактировал свой счетчик следующим образом:

//------------ Text Size spinner ---------------
        spinner = (Spinner) findViewById(R.id.TxtSizeSP);


        ArrayAdapter<String> adapter = new ArrayAdapter<String>(WidgetConfig.this,
                android.R.layout.simple_spinner_item, paths);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        // Retrieve spinner position from sharedpreferences
        SharedPreferences sharedPref = getSharedPreferences(PREFS_NAME + mAppWidgetId, MODE_PRIVATE);
        int spinnerValue = sharedPref.getInt("userChoiceSpinner",-1);
        if(spinnerValue != -1) 
          // set the value of the spinner 
          spinner.setSelection(spinnerValue);

        spinner.setOnItemSelectedListener(this);

И после всех моих случаев в методе onItemSelected() я добавил:

// save inputed spinner position to sharedpreferences
        int userChoice = spinner.getSelectedItemPosition();
        SharedPreferences sharedPref = getSharedPreferences(PREFS_NAME + mAppWidgetId, 0);
        SharedPreferences.Editor prefEditor = sharedPref.edit();
        prefEditor.putInt("userChoiceSpinner", userChoice);
        prefEditor.commit();

Это также может работать: http://a2zandroidtutorials.blogspot.dk/2012/07/spinner-with-previously-selected-value.html

person Jakob    schedule 17.11.2012