Передача значений из активности A в B и из B в C и т. д. в android

Проблема, с которой я столкнулся, заключается в том, что у меня есть 4 действия, а именно A, B, C и D. поток сначала А, затем В, затем С и так далее. Я хочу передать данные A в B, а затем данные A+B в C, затем данные A+B+C в D и т. д. Я использовал в Activity A Intent of Hashmap

HashMap<String, String> hashMap = new HashMap<>(); //declared Globally
hashMap.put("key", value);
i.putExtra("map", hashMap); (i is the Intent Object)
startActivity(i); //Starting the Intent

И на принимающей стороне, т.е. действие B

HashMap<String, String> hashMap = (HashMap<String, String>)i.getSerializableExtra("map");

Здесь я могу успешно получить данные, но когда я пытаюсь передать эти данные следующему действию, я получаю нулевые значения, вызывающие NullPointerException. В деятельности Б

Hashmap<String,String> hashMap2 = new HashMap<>;
hashMap2.put("key",hashMap.get("key"));
Log.i("Value:",hashMap.get("key"));

Здесь я получаю значения, успешно введенные, когда так же, как я передаю hashmap2 в активность C, я получаю NullPointerException. Не понимая, что здесь не так.

Я хочу передавать значения, а не сохранять их, поэтому предпочитаю Intent, а не Shared Preferences.

Спасибо за вашу помощь. Я понял, почему он давал мне нулевые значения. 1) В действии B я делал неправильный способ получения значений, т.е. сначала getIntent, а затем сумму значений A+B, т.е. putExtra следует использовать только тогда, когда Я объявляю новое намерение для класса C. Поскольку я сначала делал putExtra, а затем новое намерение для C, поэтому в C я использовал для получения нулевых значений.


person Shubham Shah    schedule 09.02.2017    source источник
comment
вы можете использовать общие настройки вместо передачи значений из одного действия в другое.   -  person Deepak Kumar    schedule 09.02.2017
comment
Лучше использовать SharedPrefrence   -  person Aman Shekhar    schedule 09.02.2017
comment
почему вы пометили javascript?   -  person Pratik Butani    schedule 09.02.2017
comment
Я не добавлял javascript, не знаю, почему он отображается.   -  person Shubham Shah    schedule 09.02.2017
comment
Трудно понять, не зная кода для установки и получения карты (для B->C) и строки кода, где происходит сбой. Точнее, зачем ставить карту как дополнительную? Пакеты, по сути, являются картами, так почему бы просто не поместить туда свои пары ключ/значение и не передать весь пакет?   -  person Krylez    schedule 09.02.2017
comment
опубликуйте свою трассировку стека для исключения.   -  person Robin Rex    schedule 09.02.2017
comment
Возможный дубликат Android - Как передать HashMap‹String,String› между действиями ?   -  person Janki Gadhiya    schedule 27.02.2017


Ответы (4)


Это может вам помочь. Вы можете просто отправить такие значения, и это сработает.

В Упражнении А:

Intent intent=new Intent(ActivityA.this,ActivityB.class);
intent.putExtra("key1","value1");
startActivity(intent);

В Упражнении Б:

String value1=getIntent.getStringExtra("key1");
Intent intent=new Intent(ActivityB.this,ActivityC.class);
intent.putExtra("key1",value1);
intent.putExtra("key2","value2");
startActivity(intent);

В действии C:

  String value1=getIntent.getStringExtra("key1");
  String value2=getIntent.getStringExtra("key2");
  Intent intent=new Intent(ActivityC.this,ActivityD.class);
  intent.putExtra("key1",value1);
  intent.putExtra("key2",value2);
  intent.putExtra("key3","value3");
  startActivity(intent);

В Упражнении D,

String value1=getIntent.getStringExtra("key1");
String value2=getIntent.getStringExtra("key2");
String value3=getIntent.getStringExtra("key3");
person Android Geek    schedule 09.02.2017

Очень беспокойно отправлять значение из одного действия в другое, используя один и тот же код Intent, написанный в каждом действии, но альтернативным способом является использование кеша.

 public class CacheManager {
        public static Map<String, Object> cachedData = new HashMap<>();


        public static void clearCache() {
            cachedData.clear();

        }

        public static void putIntoCache(String key, Object value) {
            CacheManager.cachedData.put(key, value);
        }

        public static Object getFromCache(String key) {
            if (cachedData.containsKey(key)) {
                return CacheManager.cachedData.get(key);
            } else {
                return null;
            }

        }
    }

Одним из преимуществ этого подхода является то, что вы можете изменять данные где угодно и снова помещать измененные данные в кеш.

шаг 1- Создайте класс с именем cacheManager

Шаг 2 - из любого места, где вы можете поместить значение в Cache HashMap

шаг 3- из любого места вы можете получить Value From Cache

Наслаждайтесь!

person sushant gosavi    schedule 09.02.2017
comment
Действительно ли использование статического кеша является правильным подходом? - есть другие подходы, более объектно-ориентированные - person Kevin Wallis; 09.02.2017
comment
Да, это !! в этом подходе вы можете получить доступ к данным в любом месте приложения, а также разрешить вам изменять, где бы вы ни находились! его легко внедрить и понять, и он менее запутанный ......................... просто подумайте об этом - person sushant gosavi; 09.02.2017
comment
что вы подразумеваете под объектно-ориентированным, это тоже объектно-ориентированный ....... я не могу понять, что вы хотите сказать - person sushant gosavi; 09.02.2017
comment
вместо этого я бы использовал DI Framework, например Dagger2, и создал синглтон... но да, кто знает :) это вопрос стиля - person Kevin Wallis; 09.02.2017
comment
по вашему требованию вы можете изменить это !! хорошего дня - person sushant gosavi; 09.02.2017
comment
Это удобный способ обмена членами, но это не кеш. Это карта, которая фиксирует память на время жизни вашего приложения. Он будет только расти и никогда не вытеснит устаревшие ценности. - person Krylez; 10.02.2017

используйте намерение.putExtra в намерении, подобном этому.

   Intent i = new Intent(FirstScreen.this, SecondScreen.class);   
   String strName = null;
   i.putExtra("STRING_I_NEED", strName);
   startActivity(i);/

и получить .

     String newString;
     if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if(extras == null) {
    newString= null;
} else {
    newString= extras.getString("STRING_I_NEED");
}
       } else {
    newString= (String) savedInstanceState.getSerializable("STRING_I_NEED");
person android_jain    schedule 09.02.2017

Первый вариант

Хранить данные в контексте приложения

Объявите класс, который должен расширять Application

public class HashTableBundle extends Application {

    private Hashtable<String,String> mHashTable  = null;

    public Hashtable<String, String> getmHashTable() {
        return mHashTable;
    }

    public void setmHashTable(Hashtable<String, String> mHashTable) {
        this.mHashTable = mHashTable;
    }
}

Вы можете установить данные в контексте приложения,

HashTableBundle mStat = (HashTableBundle) getApplicationContext();
mStat.setmHashTable(mMainHashTable);

Вы можете получить его из любой деятельности, используя

HashTableBundle mStat = (HashTableBundle) getApplicationContext();
 Hashtable<String,String> mHashTable = mStat. getmHashTable();

Вам нужно добавить HashTableBundle в AndroidManifest, иначе приложение выдает исключение приведения класса

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".HashTableBundle"> . . . </application>

Второй вариант

MainActivity.java



public class MainActivity extends AppCompatActivity {
    Hashtable<String,String> mMainHashTable = new Hashtable<>();
     MHashBundle mm = new MHashBundle();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMainHashTable.put("hai","I am From MainActivity");
        mm.setmHashTable(mMainHashTable);
        Intent mIntent = new Intent(MainActivity.this,ClassB.class);
        mIntent.putExtra("myhashtable", mm);
        System.out.println("data Main Activity :"+mMainHashTable.get("hai"));
        startActivity(mIntent);
        this.finish();


    }
}

Хеш-контейнер MHashBundle.java

public class MHashBundle implements Serializable {
    private Hashtable<String,String> mHashTable  = null;

    public Hashtable<String, String> getmHashTable() {
        return mHashTable;
    }

    public void setmHashTable(Hashtable<String, String> mHashTable) {
        this.mHashTable = mHashTable;
    }
}

примечание MHashBundle.java должно реализовать Serializable

Вторая активность ClassB.java

public class ClassB extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent mIntent = new Intent(ClassB.this,ClassC.class);
        MHashBundle mBundle = (MHashBundle) getIntent().getSerializableExtra("myhashtable");
        mIntent.putExtra("myhashtable",mBundle);
        System.out.println("data class B :"+mBundle.getmHashTable().get("hai"));
        startActivity(mIntent);
        this.finish();
    }

Третье действие

public class ClassC extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            MHashBundle mBundle = (MHashBundle) getIntent().getSerializableExtra("myhashtable");

        System.out.println("data class C :"+mBundle.getmHashTable().get("hai"));

    }
}
person CLIFFORD P Y    schedule 09.02.2017