在活动中将值从活动A传递到B,从B传递到C等等

时间:2017-02-09 04:37:43

标签: android android-intent hashmap

我遇到的问题是 我有4个活动,即A,B,C和D.流量先是A然后是B然后是C,依此类推。 我想将A的数据传递给B,然后将数据A + B传递给C,然后将A + B + C的数据传递给D,依此类推。 我已经在Hashmap

的活动A意图中使用过
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的空值。 在B活动中

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

在这里,我获得了成功放置的值,就像我将hashmap2传递给C活动一样,我获得了NullPointerException。 不明白这里的错误。

我想传递这些值而不是存储它们,所以我更喜欢Intent而非共享偏好。

感谢您的帮助。我发现了为什么它给了我空值 1)在B活动中,我做了错误的方法来获取值,即第一个getIntent,然后是A + B值的总和,即putExtra只应在我声明C类的新意图时使用。因为我第一次做putExtra然后新的Intent到C,所以在C中我习惯得到Null值。

4 个答案:

答案 0 :(得分:0)

在意图中使用intent.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");

答案 1 :(得分:0)

这可能对你有所帮助。你可以简单地发送这样的值,它会起作用。

在活动A中:

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

在活动B中:

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");

答案 2 :(得分:0)

使用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;
            }

        }
    }

此approch的一个优点是您可以随意修改数据并将修改后的数据再次放入缓存中

步骤1-创建名为cacheManager的类

第2步 - 从可以将值放入Cache HashMap的任何地方

从任何可以从缓存中获取值的步骤3-步骤

享受!

答案 3 :(得分:0)

第一个选项

将数据存储在应用程序上下文中

声明一个应该扩展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();


    }
}

Hashtable container 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"));

    }
}