Не сохраняет в sharedReferences из List

261
04 ноября 2017, 12:38

Заранее благодарен. Есть MainActivity (первое) и LanguageActivity (второе). В первом активити есть два поля куда нужно вставлять значение после закрытия приложения. Первое поле берет данные, которые сохраняются в sharedReferences из первого активити, второе поле должно брать данные из поля, которые получаются в случае нажатия на ячейку из списка второго активити.

Первое работает нормально, второе почему то показывает null. Хотя оформление размещения данных в references написано так же и без ошибок. Не могу найти ошибку.

public class MainActivity extends AppCompatActivity {
    public static final String APP_PREFERENCES = "mysettings";
    AppCompatButton chooseLanguageButton;
    AppCompatButton cleanButton;
    AppCompatEditText translatedTextOutput;
    AppCompatEditText translatedTextInput;
    String translatedInputString;
    RequestQueue requestQueue;
    SharedPreferences mSettings;
    final String SAVED_TEXT = "saved_text";
    final String SAVED_LANGUAGE = "saved_language";
    final String TAG = "myTag";
    String language;
    private ProgressBar progressBar;
    private Timer timer;
    private TextWatcher searchTextWatcher = new TextWatcher() {
        @Override
        public void afterTextChanged(Editable arg0) {
            Log.v(TAG, "in afterTextChanged");
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if (translatedTextInput.getText().length() != 0){
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                requestQueue = Volley.newRequestQueue(MainActivity.this);
                                sendJsonRequest();
                            }
                        });
                    }
                     InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                     in.hideSoftInputFromWindow(translatedTextInput.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }, 600);
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (timer != null) {
                timer.cancel();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "in Oncreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        chooseLanguageButton = (AppCompatButton) findViewById(R.id.choose_language_button);
        cleanButton = (AppCompatButton) findViewById(R.id.clean_button);
        translatedTextOutput = (AppCompatEditText) findViewById(R.id.translated_text_field);
        translatedTextInput = (AppCompatEditText) findViewById(R.id.translation_input_edit);
        translatedTextInput.addTextChangedListener(searchTextWatcher);
        chooseLanguageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.v(TAG, "in chooseLanguageListener");
                saveText();
                Intent intent = new Intent(MainActivity.this, ChooseLanguageList.class);
                startActivity(intent);
            }
        });
        cleanButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                translatedTextInput.setText("");
                translatedTextOutput.setText("");
            }
        });
        mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        loadText();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mSettings = null;
    }
    void saveText() {
        Log.v(TAG, "in saveText");
        mSettings = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor ed = mSettings.edit();
        ed.putString(SAVED_TEXT, translatedTextInput.getText().toString());
        ed.apply();
        Toast.makeText(this, "Text saved", Toast.LENGTH_SHORT).show();
    }
    void loadText() {
        Log.v(TAG, "in loadText");
        mSettings = getPreferences(MODE_PRIVATE);
        String savedText = mSettings.getString(SAVED_TEXT, "");
        translatedTextInput.setText(savedText);
        String savedLanguage = mSettings.getString(SAVED_LANGUAGE, "");
        Log.v(TAG, "Language in loadText PF ==================" + savedLanguage.toString());
        language =  savedLanguage.toString();
        Toast.makeText(this, "Text loaded", Toast.LENGTH_SHORT).show();
    }

    public void sendJsonRequest() {
        Log.v(TAG, "in sendJsonObject");
        Intent myIntent = getIntent();
        language = myIntent.getStringExtra("short");
        Log.v(getClass().getSimpleName(), "language short = " + language);
        translatedInputString = translatedTextInput.getText().toString().replace(" ","+");
        String url = String.format(getApplicationContext().getResources().getString(R.string.request_template),
                String.format(getApplicationContext().getResources().getString(R.string.query_Template), translatedInputString, language ));
        JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.v(TAG, "Inside OnResponse" + response.toString());
                JSONArray results = null;
                try {
                    results = response.getJSONObject("data").getJSONArray("translations");
                    for (int i=0,j=results.length();i<j;i++) {
                        String webTitle = results.getJSONObject(i).getString("translatedText");
                        translatedTextOutput.setText(webTitle);
                    }
                } catch (JSONException e) {
                    Log.e(TAG, "Error :" + e);
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error instanceof NetworkError) {
                    Log.e(TAG, "NetworkError");
                } else if (error instanceof ServerError) {
                    Log.e(TAG, "The server could not be found. Please try again after some time!!");
                } else if (error instanceof AuthFailureError) {
                    Log.e(TAG, "AuthFailureError");
                } else if (error instanceof ParseError) {
                    Log.e(TAG, "Parsing error! Please try again after some time!!");
                } else if (error instanceof NoConnectionError) {
                    Log.e(TAG, "NoConnectionError!");
                } else if (error instanceof TimeoutError) {
                    Log.e(TAG, "Connection TimeOut! Please check your internet connection.");
                }
            }
        });
        requestQueue.add(jsObjRequest);
    }
}

И самое главное второе активити

public class ChooseLanguageList extends AppCompatActivity{
    private ListView languagesListView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.choose_language_page);
        languagesListView = (ListView) findViewById(R.id.language_list);
        final LanguagesAdapter languagesAdapter = new LanguagesAdapter(this, initData());
        languagesListView.setAdapter(languagesAdapter);
        languagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent myIntent = new Intent(view.getContext(), MainActivity.class);
                String shortLanguage = initData().get(i).getShortNameLanguage();
                String longLanguage = initData().get(i).getFullNameLanguage();
                myIntent.putExtra("long", longLanguage);
                myIntent.putExtra("short", shortLanguage);
                Activity myActivity=(Activity)(view.getContext());
                SharedPreferences mSettings = myActivity.getSharedPreferences("mysettings", MODE_PRIVATE);
                SharedPreferences.Editor ed = mSettings.edit();
             Log.v("Tag", "Inside put ref = " + shortLanguage);
                ed.putString("language", shortLanguage);
                ed.apply();
                startActivity(myIntent);
            }
        });
    }
Answer 1

Для получения SharedPreferences Вы используете два метода:

  1. getPreferences(...)

  2. getSharedPreferences(...)

В первой активити Вы используете getPreferences(...), а во второй -- getSharedPreferences(...).

Первый метод возвращает SharedPreferences уровня активити, второй -- SharedPreferences уровня приложения.

В первой активити Вы сохраняете и получаете данные уровня активити, а во второй -- сохраняете на уровне приложения, отсюда и возникает Ваша проблема.

Чтобы данные были доступны из обеих активити, их необходимо сохранять в SharedPreferences уровня приложения.

Замените все вызовы getPreferences(...) на getSharedPreferences(...).

READ ALSO
Как работать с клиентской таймзоной на сервере?

Как работать с клиентской таймзоной на сервере?

Мне нужно получить таймзону клиента, для того, чтобы передать её в параметр компонента на страницеСтраница работает с бином, из которого...

263
Как просканировать JTextField&amp;?

Как просканировать JTextField&?

Используйте метод textFieldgetText()

246
Data truncation: Incorrect datetime value:

Data truncation: Incorrect datetime value:

Коллеги, подскажите: имеется строка с датой вида: Fri Oct 06 15:54:33 MSK 2017 пытаюсь её превратить в javasql

269