Как сохранить массив строк (который преобразуется из списка массивов ‹string› в массив строк) в общих настройках?

У меня два вида деятельности. Я передаю список массивов из второго действия в первое действие. В первом действии преобразуйте список массивов в массив строк. теперь я хочу сохранить этот массив строк с общими предпочтениями, но я не могу этого сделать.

второй код активности для передачи списка массивов

                Intent i = new Intent();
                //Bundle extra = new Bundle();
                //i.putStringArrayList("array",h);
                i.putStringArrayListExtra("array", h);
                //i.putExtras(extra);
                setResult(RESULT_OK,i);
                finish();

Код первой активности для получения этого результата

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{

if(requestCode == 1){

    if(resultCode == RESULT_OK){

    //  Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
        File imgFile = null;
        Bundle extras = data.getExtras();

        a= extras.getStringArrayList("array");
        try{
        al = new String[a.size()];
        al = a.toArray(al);

        //for(String ss : al)             
              for(int i = 0; i < al.length; i++){
                  imagepathb.append(al[i]).append(",");

              } 
         }
         sharedpreferences.edit().putString("imgpath",imagepathb.tostring()).commit();                            catch(Exception e){

                  }

        if(ab != null){
            ab =  sharedpreferences.getString("imgpath", ab);
          Toast.makeText(getApplicationContext(), "This is ab image path : "+ ab, Toast.LENGTH_LONG).show();    
        }else{
            Toast.makeText(getApplicationContext(), "This is null", Toast.LENGTH_LONG).show();              
        }


    }

   }
}

у меня проблемы с использованием этого кода, потому что, когда я пробую этот код, запуск выполнения только для первого синтаксиса, два других синтаксиса остаются такими, какие они есть, и Toast отображает нулевое значение. Также общие настройки не могут сохранить значение переменной String-Builder imagepathb.

  for(int i = 0; i < al.length; i++){

     imagepathb.append(al[i]).append(",");
     Toast.makeText(getApplicationContext(), "This is image path : "+ imagepathb, Toast.LENGTH_LONG).show();        
     sharedpreferences.edit().putString("imgpath",imagepathb.tostring()).commit();                    

  } 

я хочу сохранить этот массив строк в общих настройках, когда результат будет получен в onActivityResult. Но я не знаю, как это работает для множественного синтаксиса в loop. Любой может сохранить этот массив строк в общих настройках для меня. заранее спасибо.


person mahesh    schedule 18.06.2015    source источник
comment
Что вы подразумеваете под первым синтаксисом и вторым синтаксисом ??   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant, я имею в виду, это первый синтаксис imagepathb.append(al[i]).append(","); в цикле for. и это второй синтаксис Toast.makeText(getApplicationContext(), "This is image path : "+ imagepathb, Toast.LENGTH_LONG).show();, когда я запускаю только первую переменную построителя строк imagepatb, может хранить значение для tamperory, но тост не может отображать значение imagepathb   -  person mahesh    schedule 18.06.2015
comment
@Clairvoyant, когда я выполняю только переменную System.out.println(imagepathb); или Toast with imagepathb, всплывающее сообщение отображается идеально. но когда вы пытаетесь сохранить этот массив строк с общими предпочтениями, он отображает только тост, а переменная общего предпочтения остается нулевой (как есть).   -  person mahesh    schedule 18.06.2015
comment
Поместите sharedpreference строку снаружи после цикла.   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant Я также пробовал это, и это отображало нулевое всплывающее сообщение.   -  person mahesh    schedule 18.06.2015
comment
Можете ли вы отредактировать свой код и показать мне, как вы его изменили   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant, я отредактировал свой код. просто поместите sharerpreference вне цикла for.   -  person mahesh    schedule 18.06.2015
comment
Если вы делаете тост вне цикла, вы можете увидеть данные imagepathb   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant Нет, я не вижу тост вне цикла. данные imagepathb отображают ноль.   -  person mahesh    schedule 18.06.2015
comment
Если вы поместите sharedpreference внутри своего цикла, он переопределит ваши данные. И построитель строк в цикле также переопределяет, поэтому вы получаете один ввод данных.   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant Я пытаюсь сохранить его внешнюю попытку и поймать, но он все еще равен нулю. Теперь я думаю, я должен попробовать с БД.   -  person mahesh    schedule 18.06.2015
comment
Вам нужно поместить логику для сохранения в sharedPreference, сначала получить данные из общих предпочтений и использовать построитель строк, чтобы добавить новые данные со старыми данными общих предпочтений в цикле, а не вне цикла.   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant да, я пытаюсь это сделать. спасибо, что уделили мне время.   -  person mahesh    schedule 18.06.2015
comment
@Clairvoyant Эй, я сделал это. с расколом. сначала получите строку из общих настроек, используя sheredpreference.getString("imagepathb",""), и сохраните ее в String ab. После этого я добавляю split(;) вот так String[] array = ab.split(","); и запускаю цикл for и отображаю весь путь к изображению.   -  person mahesh    schedule 18.06.2015
comment
Это то, что я уже говорил вам делать, и вы тоже использовали разделение   -  person Pankaj    schedule 18.06.2015
comment
@Clairvoyant да, еще раз спасибо.   -  person mahesh    schedule 19.06.2015
comment
Я здесь, чтобы помочь, вот и все.   -  person Pankaj    schedule 19.06.2015
comment
@Clairvoyant, не могли бы вы помочь мне по этому вопросу< /а>.?   -  person mahesh    schedule 21.06.2015


Ответы (2)


Во-первых, если известно, что все строки в вашем ArrayList уникальны (т. е. не имеют дубликатов), вы можете преобразовать свой ArrayList в Set и сохранить его с помощью метод putStringSet():

sharedpreferences.edit().putStringSet("imgpath", new HashSet<String>(a)).commit();

при загрузке вы можете преобразовать его обратно в ArrayList:

ArrayList<String> myList = 
      new ArrayList<>(sharedpreferences.getStringSet("imgpath", new HashSet<String>()));

другой подход заключается в хранении нескольких значений с разными именами:

Edit edit = sharedpreferences.edit();
int cnt = 0;
for (String s : a) 
   edit.putString("imgpath_" + (cnt++), s);
while (sharedpreferences.getString("imgpath_" + cnt, null) != null) {
  edit.remove("imgpath_" + cnt); // delete all extra values from previous save time;
  cnt++;
}
edit.commit();

при загрузке вы должны проверять, пока не получите нулевое значение;

ArrayList<String> a = new ArrayList<>();
for(int cnt = 0;; cnt++) {
   String s = sharedpreferences.getString("imgpath_" + cnt, null);
   if (s == null) break;
   a.add(s);
}

И, наконец, вы можете сохранить его через запятую:

StringBuilder sb = new StringBuilder();
for (String s : a) {
    is (sb.length() > 0) sb.append(',');
   sb.append(s);
}
sharedpreferences.edit().putString("imgpath",sb.tostring()).commit();                    

При загрузке вы можете использовать String.split для возврата массива

String[] al = sharedPreferences.getString("imgpath", "").split(',');
person AterLux    schedule 18.06.2015
comment
@peter Всего одна вещь, которую вы пропустили в первом коде. вы не сохраняете его с помощью commit(); без фиксации(), это работает как простая переменная. - person mahesh; 20.06.2015

Я думаю, что лучший способ - сохранить его в базе данных, общие настройки хороши для сохранения переменных пользовательского соединения (пользователей, паролей,...), начальных переменных и т.д... Но нет, чтобы сохранить список массивов, это нехорошо практика программирования! Я также знаю, что вы не можете сохранить список массивов как список массивов, но если как наборы, вы можете увидеть этот post< /а>.

Скажите, помог ли я вам и хорошего программирования!

person Merlí Escarpenter Pérez    schedule 18.06.2015