2017-03-02 3 views
1

MainActivityにはArrayList<String>があります。私はEditItemActivityにリストの項目の1つを送りたいと思います。私はintent.putExtra()を使ってStringオブジェクトを送信しています。私は整数オブジェクトとしてもインデックスを送信しようとしていました。しかし、私はおそらくArrayList<String>のための私のインデックスとして "要求コード"変数を使用できることに気付きました。インテントのstartActivityForResult()で使用されるリクエストコードを通常の変数として使用できますか?

Android developer's documentに示されたコード例は、static final int REQUEST_CODEを使用しています。さて、静的な最終変数を通常の変数に変更するのが良い方法かどうかはわかりません。重要なことを実現していない場合は、経験豊富なデベロッパーから洞察を得たいと思います。

私のコードでは、request_code = posと設定しました。それはハックのように感じる。これは従来のリクエストコードの使い方ですか?リクエストコードのstatic final intを使用して

// 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

はあなたに、スイッチケースブロックを使用して、たとえば、onActivityResult()でそれらを評価する機会を提供します。意味のある変数名を選択することで、コードを読みやすくすることができます。これは常に良いことです。

任意のリクエストコード値を使用することは、技術的には問題ありません。あなたのActivityは、通常、同時に2つのリクエストを実行することができませんので、安全な側にいると思います。しかし、このアプローチによって実際には何が得られますか?受信したリクエストコードを何かと比較したい場合は、Activityのメモリにこの変数のint値を保持する必要があります。これは、onSaveInstanceState()に値を保存して、onRestoreInstanceState()で再度値を取得することを意味し、設定変更後も引き続きアクセスできます。プラス面では何の問題もないと思われます。

だからこそ、私はstatic final intリクエストコードを使用しています。

+0

「しかし、あなたは実際にこのアプローチで何を得ていますか?」インテントのputExtraに余分な(冗長な)情報を送る必要はありません。私はArrayListのインデックスをリクエストコードとして使用しているので、一意であるため " –

+0

@Leo Kim - まあ...いいえ、あなたの意見は分からないと思います。他のアクティビティのリクエストコード位置にアクセスしないでください(私もあなたがそれを行うことはできません) – 0X0nosugar

+0

あなたはそれを持っています:)あなたは正しいです、私はEditItemActivityで使っていません。 MainActivityは更新を読むことができますが、ArrayList内のどの項目が更新されたのかわからないので、インデックスを追跡する必要があります。インデントまたは2)要求インデックスとしてセーブインデックスを使用し、データが返ってきたときにインデックスを取得する –

2

リクエストコードが実際に何をしているのかを理解することが重要だと思います。 onActivityResultメソッドでは、通常、要求コードが実際に結果を生成したアクティビティを特定するために使用されます。これは特に、異なるタイプの結果を生成する可能性のある異なるアクティビティを開いた場合に便利です。結果を生み出す唯一のアクティビティーがあるときは、そのコードが何を与えるかは関係ありません。この場合、変数を宣言することなくstartActivityForResultメソッドに古い値を渡すだけで、すべてが本当にうまくいくでしょう。

通常、要求コードは静的な最終変数です。開発者は複数の種類の結果を持つ複数の種類のアクティビティを持つ可能性があるため、可能なすべての要求コードを確実に確認できる簡単な方法です変数名を使用して、スイッチの状態などでどのような結果が得られているかを識別することができます。これは可能性の高い状況なので、これを行うのはかなり標準的なことです。それがAndroid Developersガイドが示唆している理由です。

また、いくつかの理由から、要求コード(または変更されない文字列のようなラベル)を静的な最終変数として格納することは、一般的に有益で、かなり標準的な方法です。まず、コードを変更したり、コードを別のコードブロックで使用したり、変数をコードと比較したりすると、その静的な最終変数を使用して間違いを起こさずに間違ったコードを入力することができますあなたの記憶から。別のタイプのコードを追加したい場合は、同じ方法で行います。ファイルの同じ部分に変数を書き込んで、間違ってコードを同じにしないことを簡単に確認できます。インジケータコードでは、リストのインデックスのようなものではなく、変更しないほんのいくつかのオプションのうちの1つのコードを意味します。 (EditItemのコード、NewItemのコードと同じように)。

あなたの状況には、基本的にはあなたがやっているように何かを傷つけているわけではありませんが、いくつかの開発者はちょっと変わったかもしれません。ソフトウェアエンジニアリングの観点から見ると、意図した目的以外の目的でリクエストコードを使用しており、コードを読み取っている別の開発者が、その理由をすぐには知りません。それからもう一度、少し賢いかもしれない人もいるかもしれません。いずれにしても、特に間違ったことはありません。あなたがプライベート変数request_codeをまったく必要としないのが好きなら、その1つです。以下では、ちょっとクリーンアップしてコードをどのように使用するかを明確にするためにいくつかの変更を加えました。

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

と同じ値になります。私はあなたのコードから何かを間違えました。はい、これは本当にうまくいくでしょう。 –

関連する問題