onActivityResult, onResume и SharedPreferences вместе не работают

258
17 января 2018, 16:35

Дорогие друзья, возникла проблема, помогите пожалуйста. В приложении есть активити с фрагментом, в котором происходит основное действие, а именно: есть несколько невидимых картинок и кнопка. При нажатии на кнопку нас перекидывает на другую активити, где просят ввести пин-код, мы вводим, и нас перебрасывает обратно (использую для этого onActivityResult), и картинка становится видимой.
Так как у нас несколько картинок, возникла необходимость сохранять их состояние (если свернуть, или закрыть приложение, и снова зайти в это активити - все картинки снова невидимые).
Я решил использовать для этого SharedPreferences, onResume и onPause.
Но возникла проблема: теперь картинка не становится видимой после ввода пин-кода и возвращении к первой активити. А если убрать проверку пин-кодом, и просто попросить кноку сделать картинку видимой, то все работает, и сохраняет.

Прикладываю кусочек кода:

public class MainFragment extends Fragment {
private ImageView imageViewDoneOne, imageViewDoneTwo;
private SharedPreferences mSettings;
public static final String APP_PREFERENCES = "Settings";
public static final String APP_PREFERENCES_STAMP = "stamp1";
public static final String APP_PREFERENCES_STAMP2 = "stamp2";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container,false);
    mSettings = this.getActivity().getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
    imageViewDoneOne = (ImageView)view.findViewById(R.id.done_one);
    imageViewDoneTwo = (ImageView)view.findViewById(R.id.done_two);
    view.findViewById(R.id.button_stamp).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (imageViewDoneOne.getVisibility() == View.INVISIBLE){
                //Делаем картинку видимой без переносана в PinActivity и SharedPreferences работает
                imageViewDoneOne.setVisibility(View.VISIBLE);
            } else if (imageViewDoneOne.getVisibility() == View.VISIBLE &&
                    imageViewDoneTwo.getVisibility() == View.INVISIBLE){
                //Делаем картинку видимой с переходом в PinActivity и SharedPreferences НЕработает
                Intent intent = new Intent(getActivity(), PinActivity.class);
                startActivityForResult(intent, 1);
            }
        }
    });
    return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data == null) {return;}
    int visi = data.getIntExtra("value", View.VISIBLE);
    if (imageViewDoneOne.getVisibility() == View.INVISIBLE) {
        imageViewDoneOne.setVisibility(visi);
    } else if (imageViewDoneOne.getVisibility() == View.VISIBLE &&
            imageViewDoneTwo.getVisibility() == View.INVISIBLE){
        imageViewDoneTwo.setVisibility(View.VISIBLE);
    } 
}
@Override
public void onResume() {
    super.onResume();
    if (mSettings.contains(APP_PREFERENCES_STAMP)){
        imageViewDoneOne.setVisibility(mSettings.getInt(APP_PREFERENCES_STAMP, 0));
    }
    if (mSettings.contains(APP_PREFERENCES_STAMP2)){
        imageViewDoneTwo.setVisibility(mSettings.getInt(APP_PREFERENCES_STAMP2, 0));
    }
}
@Override
public void onPause() {
    super.onPause();
    SharedPreferences.Editor editor = mSettings.edit();
    editor.putInt(APP_PREFERENCES_STAMP, imageViewDoneOne.getVisibility());
    editor.apply();
    editor.putInt(APP_PREFERENCES_STAMP2, imageViewDoneTwo.getVisibility());
    editor.apply();
}  
}

PinActivity:

public class PinActivity extends AppCompatActivity {
public static final String TAG = "PinLockView";
private PinLockView mPinLockView;
private IndicatorDots mIndicatorDots;
private String pinCode = "1234";
public static int visibility = View.VISIBLE;
private PinLockListener mPinLockListener = new PinLockListener() {
    @Override
    public void onComplete(String pin) {
        Intent answer = new Intent();
        Log.d(TAG, "Pin complete: " + pin);
        if (pin.equals(pinCode)) {
            answer.putExtra("value", visibility);
            setResult(RESULT_OK, answer);
            finish();
        } else {
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Wrong pin", Toast.LENGTH_SHORT);
            toast.show();
        }
    }
    @Override
    public void onEmpty() {
        Log.d(TAG, "Pin empty");
    }
    @Override
    public void onPinChange(int pinLength, String intermediatePin) {
        Log.d(TAG, "Pin changed, new length " + pinLength + " with intermediate pin " + intermediatePin);
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pin);
    mPinLockView = (PinLockView) findViewById(R.id.pin_lock_view);
    mIndicatorDots = (IndicatorDots) findViewById(R.id.indicator_dots);

    mPinLockView.attachIndicatorDots(mIndicatorDots);
    mPinLockView.setPinLockListener(mPinLockListener);
    mPinLockView.setPinLength(4);
    mPinLockView.setTextColor(ContextCompat.getColor(this, R.color.white));
    mIndicatorDots.setIndicatorType(IndicatorDots.IndicatorType.FILL_WITH_ANIMATION);
}

}

Спасибо всем за внимание и простите, если вопрос глупый, так как только учусь!)

Answer 1

Имейте в виду что сначала идет вызов метода onActivityResult(), а после onResume() который переопределяет видимость вашего изображения

Для сохранения состояния данных лучше использовать метод onSaveInstanceState

READ ALSO
Как из String'ga вытащить различные аргументы?

Как из String'ga вытащить различные аргументы?

Как из строки получить определенные аргументы?

157
Проблема со считываением клика Android

Проблема со считываением клика Android

ЗдравствуйтеНаткнулся на такую проблему: имею 3 кнопки(ImageButton), необходимо после 1-ого нажатия на одну из кнопок,отследить послеующее нажатие(OnClick)...

228
Передать список из JSP в JS

Передать список из JSP в JS

В файле JSP происходит обработка карты entry:

246
XML парсинг Android [требует правки]

XML парсинг Android [требует правки]

Здравствуйте, есть задание скачать файл XML по ссылке, парсить и сохранить данные в SQLПоделитесь пожалуйста мыслями, ссылками на ресурсы и похожие...

175