2017-03-02 24 views
1

我在MainActivity中有一個ArrayList<String>。我想發送一個列表中的項目到EditItemActivity。我正在使用intent.putExtra()發送String對象。我也將發送索引作爲整數對象。但我意識到我可以使用「請求代碼」變量作爲ArrayList<String>的索引。在Android developer's document所示可以使用intent的startActivityForResult()中使用的請求代碼作爲常規變量嗎?

代碼示例使用static final int REQUEST_CODE。現在,我不確定如果改變(通常是什麼)靜態最終變量是一個好習慣。我想從更有經驗的開發人員那裏獲得一些見解,以防我沒有意識到重要的事情。

在我的代碼

這裏我設request_code = pos。這感覺就像一個黑客。這是使用請求代碼的傳統方式嗎?

// MainActivity.java 

private int request_code; 
ArrayList<String> items; 
ListView listView; 

...  

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id) { 
      Intent i = new Intent(MainActivity.this, EditItemActivity.class); 
      i.putExtra("text", items.get(pos)); 
      request_code = pos; 
      startActivityForResult(i, request_code); 
    } 
}); 

... 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode == RESULT_OK && requestCode == request_code){ 
     String newText = data.getExtras().getString("newText"); 
     items.set(request_code, newText); 
     itemsAdapter.notifyDataSetChanged(); 
    } 
} 
// EditItemActivity.java 

public void onSaveItem(View v) { 
    String newText = editText.getText().toString(); 
    Intent i = new Intent(); 
    i.putExtra("newText", newText); 
    setResult(RESULT_OK, i); 
    finish(); 
} 

回答

2

使用static final int您的請求代碼讓您有機會使用的switch-case塊,以評估他們在onActivityResult(),例如。通過選擇有意義的變量名稱,可以使代碼更具可讀性,這總是一件好事。

使用任意請求代碼值不會做傷害技術上。你的Activity通常不會有兩個這樣的請求同時運行,所以我想你在那裏安全。但是,你通過這種方法真正獲得了什麼?如果您想將傳入的請求代碼與任何內容進行比較,則必須將此變量int值保存在Activity的內存中。這意味着將值保存在onSaveInstanceState()中,並在onRestoreInstanceState()中再次檢索,以便在配置更改後仍可以訪問它。似乎是一個很大的麻煩,沒有任何好的方面。

這就是爲什麼我會用static final int請求代碼。

+0

「但是,您通過這種方法真正獲得了什麼?」我不必在意圖的putExtra中發送額外(冗餘)信息。我使用ArrayList的索引作爲請求代碼,因爲它也恰好是唯一的「 –

+0

@Leo Kim - 唔...不,我認爲我沒有明白你的觀點,對不起,據我所知,你不要訪問另一個活動中的請求代碼位置(我甚至不知道你能做到這一點) – 0X0nosugar

+0

你有點懂了:)你說得對,我沒有在我的EditItemActivity中使用它。更新String對象,我把它發送回MainActivity,MainActivity可以讀取更新,但不知道ArrayList中的哪個項目被更新了,所以我需要跟蹤索引,我可以1)發送index in這個縮進或2)使用保存索引作爲請求代碼,並在數據返回時檢索索引 –

2

我想了解什麼請求代碼實際上做的是很重要的。在您的onActivityResult方法中,請求代碼通常用於確定實際產生結果的活動。當您打開可能產生不同類型結果的不同活動時,這非常有用。當它只有一個可能產生結果的活動時,只要你給出一個代碼,那麼代碼是什麼並不重要。在這種情況下,您可以只提供startActivityForResult方法的任何舊數字,而不必聲明變量,一切都會很好。

通常情況下,請求代碼是一個靜態最終變量,因爲開發人員知道他們可能擁有多種類型的活動並且有多種結果,這樣他們就可以輕鬆地確保所有可能的請求代碼是唯一的,變量名稱可用於確定您在交換機狀態或類似情況下獲得的結果類型。由於這是一種可能的情況,因此採用這種方式非常標準,這就是Android開發人員指南建議的原因。

通常也有益的,漂亮的標準做法是任何一種像的請求的代碼(或相似的一個不變的字符串的任何標籤)指示符的代碼存儲爲一對夫婦原因靜態最終變量。首先,無論何時您對代碼進行修改或在另一個代碼塊中使用它,或者將變量與代碼進行比較,您都可以簡單地使用該靜態最終變量,並且知道您沒有犯錯,並輸入錯誤的代碼從你的記憶中。如果你想添加另一種類型的代碼,你可以用相同的方式來完成,你可以將變量寫在文件的同一部分,並且能夠很容易地確認你不會意外地使代碼相同。通過指標代碼,我並不是指像列表的索引,而是代表僅有的幾個不會改變的選項之一。 (像EditItem的代碼和NewItem的另一個代碼)。

對於你的情況,基本上你不會傷害任何像你這樣做的事情,但是有些開發者可能會覺得它有點奇怪。從更多的軟件工程角度來看,您使用請求代碼的目的不是其他目的,而另一位讀取代碼的開發人員可能不會立即知道您爲什麼這樣做。然後,有些人可能會發現它有點聰明。無論哪種方式,它沒有什麼特別的錯誤。有一件事情,如果你這樣做,你根本不需要私有變量request_code。下面我做了一些修改,以便稍微清理一下,並更明確地說明你如何選擇使用代碼。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id) { 
      Intent i = new Intent(MainActivity.this, EditItemActivity.class); 
      i.putExtra("text", items.get(pos)); 
      startActivityForResult(i, pos); 
    } 
}); 


    ... 


    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //No need to compare requestCode with anything, as it always defines the index, not the type of result 
    if(resultCode == RESULT_OK){ 
     String newText = data.getExtras().getString("newText"); 
     items.set(requestCode, newText); 
     itemsAdapter.notifyDataSetChanged(); 
    } 
} 
+0

感謝您的解釋。但是,如果我想用這種方法更新正確的索引,我仍然需要分配'request_code = pos'。 –

+1

我不知道爲什麼?當您發送結果活動和結果返回時,request_code不會發生變化,而且我的代碼始終是選定的項目。當它作爲requestCode返回時,它將與pos – drawinfinity

+0

相同。我從你的代碼中誤讀了一些東西。是的,這確實會起作用。 –

相關問題