Edittext автосохранение входных данных для различных объектов (синглтон) с обработчиком / запуском в зависимости от того, какой spinneritem выбран
У меня есть довольно сложная проблема, которую я просто не могу найти решения. Я пытаюсь создать приложение, которое позволяет мне настраивать различные параметры для приложения windows.
Я построил небольшой проект, чтобы продемонстрировать, что я пытаюсь сделать, макет выглядит примерно так https://i.imgur.com/azpeGvW.png.
Мои данные хранятся в синглтоне и инициализируются из XML.
При запуске действия я заполняю EditText данными в зависимости от того, какой элемент в данный момент выбран в прядильщике.
Извините за длину входящего кода, но я изо всех сил стараюсь проиллюстрировать, каковы мои цели.
Одиночка:
public class Singleton { private static volatile Singleton Instance; public Singleton() { if (Instance != null){ throw new RuntimeException("Use getInstance() method to get the single instance of this class!"); } } public static Singleton getInstance(){ if(Instance == null){ synchronized (Singleton.class){ if(Instance == null) Instance = new Singleton(); } } return Instance; } //Components private Settings settings1; private Settings settings2; private Settings settings3; private Settings settings4; public static void initSingleton(Singleton singleton){ Instance = singleton; } public Settings getSettings1() { return settings1; } public void setSettings1(Settings settings1) { this.settings1 = settings1; } public Settings getSettings2() { return settings2; } public void setSettings2(Settings settings2) { this.settings2 = settings2; } public Settings getSettings3() { return settings3; } public void setSettings3(Settings settings3) { this.settings3 = settings3; } public Settings getSettings4() { return settings4; } public void setSettings4(Settings settings4) { this.settings4 = settings4; } }
SettingsClass:
public class Settings { private int option1; private int option2; private int option3; private String option4; private String option5; public int getOption1() { return option1; } public void setOption1(int option1) { this.option1 = option1; } public int getOption2() { return option2; } public void setOption2(int option2) { this.option2 = option2; } public int getOption3() { return option3; } public void setOption3(int option3) { this.option3 = option3; } public String getOption4() { return option4; } public void setOption4(String option4) { this.option4 = option4; } public String getOption5() { return option5; } public void setOption5(String option5) { this.option5 = option5; } }
Основная активность:
public class MainActivity extends AppCompatActivity { //Singleton instance private Singleton singleton; //Vars String itemSelected; //Views private EditText etOption1; private EditText etOption2; private EditText etOption3; private EditText etOption4; private EditText etOption5; private Spinner spSettings; //Other private ArrayAdapter<CharSequence> mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); singleton = Singleton.getInstance(); etOption1 = (EditText) findViewById(R.id.et_option1); etOption2 = (EditText) findViewById(R.id.et_option2); etOption3 = (EditText) findViewById(R.id.et_option3); etOption4 = (EditText) findViewById(R.id.et_option4); etOption5 = (EditText) findViewById(R.id.et_option5); spSettings = (Spinner) findViewById(R.id.sp_settings); mAdapter = ArrayAdapter.createFromResource(this,R.array.spinneroptions,android.R.layout.simple_spinner_item); spSettings.setAdapter(mAdapter); spSettings.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { itemSelected = spSettings.getSelectedItem().toString().trim(); initInputs(itemSelected); //Fills EditTexts with data from singleton } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); etOption1.addTextChangedListener(new AutosaveTextwatcher(itemSelected,"option1",etOption1)); etOption2.addTextChangedListener(new AutosaveTextwatcher(itemSelected,"option2",etOption2)); etOption3.addTextChangedListener(new AutosaveTextwatcher(itemSelected,"option3",etOption3)); etOption4.addTextChangedListener(new AutosaveTextwatcher(itemSelected,"option4",etOption4)); etOption5.addTextChangedListener(new AutosaveTextwatcher(itemSelected,"option5",etOption5)); } }
Мое намерение для AutoSaveTextWatcher, который является пользовательским TextWatcher, в значительной степени заключается в том, что он запускает запускаемый после того, как пользователь закончит редактирование EditText и сохранит ввод в singleton в зависимости от того, какой элемент выбран в spinner.
Я просто пытаюсь сохранить все входные данные для выбранных настроек до того, как пользователь изменит settingsitem в спиннере. Это не совсем сработало с проверкой EditText !hasFocus.
Проблема, с которой я сталкиваюсь при нынешнем подходе, заключается в том, что TextWatcher также реагирует на "заполнение" редактируемого текста, что приводит к сохранению какого-то странного дерьма.
Херес TextWatcher:
public class AutosaveTextwatcher implements TextWatcher{ private String selectedItem; private String saveTo; private EditText editText; private Handler handler = new Handler(Looper.getMainLooper()); private Runnable runnable; public AutosaveTextwatcher(String item, String s, EditText et) { this.selectedItem = item; this.saveTo = s; this.editText = et; } @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { handler.removeCallbacks(runnable); runnable = new Runnable() { @Override public void run() { if(!editText.getText().toString().trim().equals("")){ savenInputs(String itemSelected, String saveTo); //Switch settings1-4 cases for what SpinnerItem is selected and switch option1-5(saveTo) for what editText to save. } } }; handler.postDelayed(runnable,500); } }
Как я уже сказал, мне каким-то образом нужно сохранить все входные данные для каждого из spinnerItems. Чтобы сохранить определенный editText я бы сделал это следующим образом:
For Strings: Singleton.getInstance().getSettings1-4().setOption1 -5(editText.getText().toString().trim()); For Integer: Singleton.getInstance().getSettings1-4().setOption1-5(Integer.parseInt(editText.getText().toString().trim()));
Я ценю всех, кто читает этот длинный пост, и буду более чем счастлив попробовать любой подход, который вы, ребята, предложите.
овации
Что я уже пробовал:
Попробовал написать пользовательский TextWatcher с обработчиком & amp; runnable, который работает через 500 мс после textchanged, текущий подход. Также попытался проверить, есть ли edittext !hasFocus и сохранить, когда он теряет фокус, на самом деле не работает.
David Crow
Пробовали ли вы реализовать OnFocusChangeListener для каждого из элементов управления EditText? Таким образом, когда каждый элемент управления EditText теряет фокус, вы получаете уведомление и можете сохранить текст элемента управления соответствующим образом.