2013-06-10 2 views
0

Сначала я искал эту информацию около недели и нашел очень мало. Так что, надеюсь, это долгое чтение помогает другим людям.onPause() & onSaveInstanceState() для созданного пользовательского интерфейса

Я создал UI от JSON. Это UI имеет все виды Views. Такие как EditText, RadioButton, CheckBox, Spinner и т. Д. Теперь мне нужно учитывать некоторые неизбежные сценарии. Вращение экрана, телефонный звонок, кнопка «Назад», кнопка «домой» и т. Д. Поскольку все эти Views создаются после сетевого вызова/ответа, и это требует времени, я не хочу повторять это действие каждый раз. Таким образом, экономия фактических RadioButton или EditText и что было выбрано на RadioButton или набрано в EditText чрезвычайно важно. Из того, что я прочитал для вращения экрана, я использую onSaveInstanceState(). Для чего бы то ни было, я бы использовал onPause(), потому что это единственная вещь, которая призвана быть вызванной.

Проблема заключается в том, я понятия не имею, как сохранить созданный программно Views с в sharedprefs или А bundle не говоря уже о ценности без идентификатора в их держат. Давайте посмотрим на мой код, а затем обсудим то, что, по моему мнению, в настоящее время возможно.

allEdit = new ArrayList<EditText>(); 

    else if (map.get(TAG_FIELD).equals(et)) { 
       Log.v("RESPONSE", "About to create an EditText"); 
       // find 
       LinearLayout content = (LinearLayout) getActivity() 
         .findViewById(R.id.add); 
       // create 
       TextView tv = new TextView(getActivity()); 
       EditText et = new EditText(getActivity()); 
       LinearLayout ll1 = new LinearLayout(getActivity()); 
       // set 
       tv.setLayoutParams(new LinearLayout.LayoutParams(
          LinearLayout.LayoutParams.WRAP_CONTENT, 
          LinearLayout.LayoutParams.MATCH_PARENT)); 
        et.setLayoutParams(new LinearLayout.LayoutParams(
          LinearLayout.LayoutParams.MATCH_PARENT, 
          LinearLayout.LayoutParams.MATCH_PARENT)); 
        ll1.setLayoutParams(new LinearLayout.LayoutParams(
          LinearLayout.LayoutParams.MATCH_PARENT, 
          LinearLayout.LayoutParams.MATCH_PARENT)); 
        tv.setText(map.get(TAG_NAME)); 
        ll1.setOrientation(LinearLayout.HORIZONTAL); 
        // add 
        ll1.addView(tv); 
        ll1.addView(et); 
        allEdit.add(et); 
        content.addView(ll1); 
       } 

Таким образом, в приведенном выше примере, я создал EditText и хранить его в ArrayList<EditText>. Теперь я думал, что в onPause() я мог бы сделать что-то вроде этого.

for (int i = 0; i < allEdit.size(); i++) { 
    EditText et = allEdit.get(i); 
    String input = et.getText().toString(); 
    prefsEdit.put(input); 
} 

который я думаю, что мог бы работать, он также может перезаписывать String «вход» в общих настройках снова и снова. Не совсем уверен, как это работает. Он также по-прежнему не решает, как сохранить фактический EditText, чтобы его не нужно было воссоздавать.

Сейчас в onSavedInstanceState() Я думаю, что мне удастся просто вставить целое ArrayList<EditText> в качестве сериализуемого, верно? Как это ...

putSerializable("key", allEdit) 

Однако это не сохраняет значения внутри них.

Так как я сохранить эти Viewsи их значения в onSavedInstanceState() и onPause()? Возможно, что более важно, мне нужны оба? Могу ли я уйти, просто используя onPause()?

Спасибо

+0

проверить эту ссылку может помочь http://developer.android.com/guide/topics/resources/runtime-changes.html – Raghunandan

+0

@Raghunandan Я прочитал статью. Он затрагивает то, что я рассказываю здесь, о том, что вы не выполняете сетевые запросы дважды, но не пересматривает, как их реализовать на программно созданных представлениях/объектах. –

+0

@ Raghunandan при последующем рассмотрении. Я нашел этот setRetainInstance(). Что выглядит многообещающим. –

ответ

1

Я попытался нету, но это звучит, как это будет работать на практике. При создании активности (до заполнения JSON) создайте свою собственную ViewGroup. Оттуда прочитайте JSON и добавьте каждое представление, которое вы получите в VeiwGroup. Затем, когда вы хотите сохранить информацию или что-то сделать это

int viewCount = mViewGroup.getChildCount(); 
for(i=0;i<viewCount;i++) { 
    newView = mViewGroup.getChildAt(i); 
    if (newView instanceOf EditText) { 
     EditText newEditText = (EditText)newView 
     string value = newEditText.getText(); 
    } 
    else if (newView instanceOf RadioButton) { 
     same as above^
     etc... 
    } 

} 

Затем для каждого из значений, которые тянут добавить их в массив, может быть, даже NamedPair хранить их ID и значение (по идентификатору я имею в виду индекс которого зрения).Так

public List<String> lstEditTextValues = new ArrayList<String>(); 

После всего, что сказано и сделано, то вы можете itterate через каждый из них, и сохранить его как отдельное значение через пучок, сохранить в общей прив, или поместить в переменную уровня статический класс (не самый безопасный способ сохранить информацию, но работает).

Надеюсь, это поможет. Дайте мне знать, если im полностью вне темы

+0

. Я не думаю, что вы не в тему. Я просто совершенно новый, так что это несколько запутанно. Итак, вы говорите, что покончите с моим «ArrayList ' и т. Д. И добавьте эти 'Просмотры' в' ViewGroup' вместо этого? Затем, когда я вызываю 'onSavedInstanceState()' или 'onPause()', используйте приведенный выше код для циклического просмотра «Просмотргрупп» и получения/сохранения моей информации? –

+0

Я только что узнал об этом методе 'setRetainInstance()' [здесь] (http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29). Считаете ли вы, что это сработает? –

+1

Это может сработать. У этого есть свои собственные недостатки. Особенно, если вы используете фрагменты и переворачиваете между кратными. Кроме того, он очень ресурсоемкий и чаще будет вызывать сборщик мусора (особенно в случае активации нескольких действий/фрагментов). OnSaveInstanceState - самый используемый и безопасный метод. Я бы даже не использовал его в onPause, потому что он был бы лишним. Всякий раз, когда ваша активность разрушается, приостанавливается или теряет фокус, onSaveInstanceState называется – Shaun

Смежные вопросы