私のスイッチケースステートメントは、昨日完全に正常に機能します。しかし、今朝早めにコードを実行すると、Eclipseは赤色でcaseステートメントに下線を引くエラーを出し、「case式は定数式でなければならない、それは定数です。何が起こったのかわかりません。」以下は私のコードです:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
すべてのR.id.intには、すべて下線が引かれています。
通常のAndroidプロジェクトでは、リソースRクラスの定数は次のように宣言されます。
public static final int main=0x7f030004;
ただし、ADT 14では、ライブラリプロジェクトで次のように宣言されます。
public static int main=0x7f030004;
つまり、定数はライブラリプロジェクトでは最終的なものではありません。したがって、コードはコンパイルされなくなります。
これに対する解決策は簡単です。switchステートメントをif-elseステートメントに変換します。
public void onClick(View src)
{
int id = src.getId();
if (id == R.id.playbtn){
checkwificonnection();
} else if (id == R.id.stopbtn){
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
} else if (id == R.id.btnmenu){
openOptionsMenu();
}
}
http://tools.Android.com/tips/non-constant-fields
次を使用して、switch
ステートメントをif-else
ステートメントにすばやく変換できます。
Eclipseではswitch
キーワードにカーソルを移動して押します Ctrl + 1 次に選択
「スイッチ」を「if-else」に変換します。
Android Studioでswitch
キーワードにカーソルを移動して押します Alt + Enter 次に選択
「switch」を「if」に置き換えます。
プロジェクトのプロパティで「Is Library」のチェックを外すとうまくいきました。
次の方法で解決できます。
例:
public static final int cameraRequestCode = 999;
これがお役に立てば幸いです。
この問題の簡単な解決策は次のとおりです。
switchをクリックしてからCTL + 1、を押すと、スイッチがif-else blockステートメントに変更され、問題が解決します
R.id. *。これは、ADT 14が最終的な静的intとして宣言されないため、switch caseコンストラクトで使用できないためです。代わりにif else句を使用できます。
If-elseの代わりにNiceスイッチを保持するこの他のソリューションはどうですか。
private enum LayoutElement {
NONE(-1),
PLAY_BUTTON(R.id.playbtn),
STOP_BUTTON(R.id.stopbtn),
MENU_BUTTON(R.id.btnmenu);
private static class _ {
static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
}
LayoutElement(int id) {
_.elements.put(id, this);
}
public static LayoutElement from(View view) {
return _.elements.get(view.getId(), NONE);
}
}
あなたのコードでこれを行うことができます:
public void onClick(View src) {
switch(LayoutElement.from(src)) {
case PLAY_BUTTTON:
checkwificonnection();
break;
case STOP_BUTTON:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case MENU_BUTTON:
openOptionsMenu();
break;
}
}
列挙型は静的であるため、影響は非常に限定的です。懸念される唯一のウィンドウは、関連するダブルルックアップです(最初は内部SparseArrayで、後でスイッチテーブルで)
つまり、この列挙型は、必要に応じてidへの参照を保持することで、アイテムを流itemsに取得するためにも使用できますが、それは別の話です。
クラスで宣言された変数を持つ関数でスイッチを使用すると、このエラーがスローされました:
private void ShowCalendar(final Activity context, Point p, int type)
{
switch (type) {
case type_cat:
break;
case type_region:
break;
case type_city:
break;
default:
//sth
break;
}
}
クラスの先頭の変数にfinal
を宣言すると、問題は解決しました。
final int type_cat=1, type_region=2, type_city=3;
私が言及したいのは、プロジェクトにライブラリを追加しようとしたときに同じ状況に出くわしたことです。突然、すべてのswitchステートメントがエラーを表示し始めました!
今、追加したライブラリを削除しようとしましたが、それでも動作しませんでした。どのように "私がプロジェクトをきれいにしたとき"すべてのエラーがちょうど消えました!