2017-02-09 62 views
-2

我已經卡住的問題是 我有4個活動分別爲A,B,C和d。流程是先A然後B然後C等等。 我想傳遞給B和A的數據然後數據A + B到C,則A + B + C,以d的數據等等.. 我在活動中使用的Hashmap傳遞值從活動A到B並從B到C等在機器人

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。 不理解什麼是錯在這裏。

我要傳遞的值,而不是存儲它們,所以我寧願在意圖共享偏好。

感謝您的幫助。我發現它爲什麼給我空值 1)在B活動中,我做錯了方法來獲取值,即首先getIntent,然後A + B值的總和即putExtra應該當我宣佈爲C類的新意圖的前提下使用。因爲我是第一次做putExtra,然後新的意向C,所以在C I用來獲取空值。

+1

,可以使用共享的,而不是從一個活動將值傳遞給另一個偏好。 –

+1

更好地使用SharedPrefrence – Shekhar

+0

爲什麼你已經標記了[tag:javascript]? –

回答

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

這實在是忙碌,從一個活動送價值寫在每一個活動,但另一種方式的另一個使用意向相同的代碼是使用高速緩存

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步 - 你可以把值放入緩存的HashMap

步驟3從在哪裏你可以得到Value From Cache

Enjoy!在應用程序上下文

+0

使用靜態緩存真的是正確的方法嗎? - 還有其他方法更面向對象 –

+0

是的,它是!在這些方面你可以訪問應用程序中的任何地方的數據,並允許你修改你想要的地方!它易於實現,理解並且不易混淆............................就這麼想吧 –

+0

這是什麼意思?也是面向對象的.......我不能明白你想說什麼 –

0

第一個選項

存儲數據聲明一個類,應該由

HashTableBundle mStat = (HashTableBundle) getApplicationContext(); 
mStat.setmHashTable(mMainHashTable); 
擴展應用

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

您可以設置數據到應用程序上下文210

您可以通過使用任何活動得到它

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

您需要在AndroidManifest添加HashTableBundle否則應用程序將引發類轉換異常

<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(); 
    } 

Thrird活動

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

    } 
} 
相關問題