2017-01-15 17 views
1

私はコンテキストメニュー項目のタイトルを取得して文字列と比較しています。以下のコードは期待どおりに動作していないようですが、なぜですか?文字列と文字列とをアンドロイドで比較する

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if (item.getTitle().equals(String.valueOf(R.string.item_edit_text))){ // <-- compared to string extract 
     Toast.makeText(this, "Match",Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(this, "No Match",Toast.LENGTH_SHORT).show(); 
    } 
    return super.onContextItemSelected(item); 
} 

"編集" とR.string.item_edit_textitem.getTitle結果が "編集" です。なぜ、上記のコードは "No Match"になるのですか?

以下のコードは正常に動作するようです、しかし、

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if (item.getTitle().equals("Edit")){ // <--- Compared to hardcoded string 
     Toast.makeText(this, "Match",Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(this, "No Match",Toast.LENGTH_SHORT).show(); 
    } 
    return super.onContextItemSelected(item); 
} 
+0

'String.valueOf(R.string.item_edit_text) 'ではなく' getString(R.string.item_edit_text) 'を試してください。 –

+0

それはうまくいく、どんな考え? – Leb

+0

まだ正確な理由を見つけようとしています。私は 'String.valueOf()'も動作すると思っていましたが、動作しませんでした。 –

答えて

2

R.string.item_edit_textはおそらくEditTextタイプです。

あなたが書いた:

String.valueOf(R.string.item_edit_text) 

それは最終的にR.string.item_edit_text.toString()を返しますが にEditTextのテキストをR.string.item_edit_text.toString()返しません。

によって返された編集可能なインスタンスに対して、toge()を適用するには、R.string.item_edit_text.getText().toString()を実行する必要があります。

あなたはそれを書くことができます:

if (item.getTitle().equals(R.string.item_edit_text.getText().toString())){ 

または:

if (item.getTitle().equals(getString(R.string.item_edit_text))){ 
+0

@jackjayのコメントに基づいて、コードをたどって同じ結論に至りました。しかし、私が 'Toast.makeText(this、String.valueOf(R.string.item_edit_text)、Toast.LENGTH_SHORT)を実行すると、.show();'私は同じテキストを取得します。 – Leb

+0

'makeText()'のシグネチャを見てください: 'Toast makeText(コンテキストコンテキスト、 int resId、 int duration)'リソースに含まれるテキストではなく、resIdを2番目のパラメータとして取ります。 'makeText()'で実行されます – davidxxx

+0

説明をありがとうございます。 – Leb

0

String.valueOf()は、あなたがそれに渡すint引数の文字列表現を返します。そしてあなたはメソッドにResource idを渡しました。したがって、このメソッドは、期待どおりのリソースではなくString表現を返します。 getString(R.string.item_edit_text)を使用してください。

2

これは私が見つけたものであり、それは説明しているようです。

Context内のgetString(int)メソッドとそのサブクラス(Activityなど)は、アプリに含まれる文字列リソースを検索するためのもので、検索するリソースを特定するパラメータとして文字列リソースIDが使用されます。ここでも、Javaではこのパラメータは通常の整数のように見えます。

String.valueOf(int)は全く異なります。これは、整数を取り、その整数の文字列表現を生成するJavaライブラリ関数です。 String.valueOf(5)は "5"を返します。 Android文字列リソースを取得するのには便利ではありません。

+0

上記のコメントをあなたの説明に加えていただければ、私は受け入れたものとしてマークします。 – Leb

+1

私はそれが間違っていると思ったので、私はそれをするつもりはありません。 :-) –

関連する問題