2011-02-02 11 views
1

私はアプリを作っていて、メニューから新しいアクティビティを起動したいが、いつもメニューボタンをクリックするとアプリがクラッシュする。私は多くの方法を試したが、すべてが失敗した。メニューボタンからアクティビティを起動しますか?

public boolean onCreateOptionsMenu(Menu menu) { 
new MenuInflater(getApplication()) 
     .inflate(R.menu.menu, menu); 


return(super.onPrepareOptionsMenu(menu)); 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
switch (item.getItemId()) { 
    case R.id.Menu1:   
    Toast.makeText(this, "Coming soon", Toast.LENGTH_SHORT).show(); 
    break; 
    case R.id.Menu2: 
     Intent Intent = new Intent(this, About.class); 
     startActivity(Intent); 


} 
return(super.onOptionsItemSelected(item)); 
} 
} 

Androidのマニフェスト

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> 
    <activity android:name=".AndroidRssReader" 
      android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".About" android:label="@string/app_label"></activity> 
+1

logcatのデータはありますか? –

+0

はマニフェストファイルのアクティビティとして宣言されていますか? –

+0

ログ/スタックトレースがなければ、私たちは大いに助けます... – Hameno

答えて

1

onOptionsItemSelected()の実装は、いつもスーパークラスに渡すのではなく、自分で選択を処理したときにtrueを返すので、若干異なります。

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.Menu1: 
     Intent myIntent = new Intent(this,About.class); 
     startActivity(myIntent); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

チェック私たちは本当に

+0

私はまったく同じコードを使用し、それは完全に動作します!しかし、私はちょうど疑問に思った、ドキュメントは基本クラスを呼び出すときについては非常に明確ではない...我々は代わりにすべてのケースでそれを呼び出す必要がありますか? – Gromix

+0

@Gromix私は、文書の文言によりつもりだった: '通常のメニュー処理の続行を許可する場合はfalseを返し、ブール、真here.'それを消費するためにおそらく、私はドキュメントを誤解していますか? –

+0

これはスイッチのステートメントを正しく終了するという私の素早い答えに伴います。それはデフォルトのメニューhandling'を実行するために私が '派生クラスは、基本クラスに通じ呼び出す必要がありますされて混乱何 – trgraglia

1

それは例えば、いくつかのことかもしれないあなたのルートパッケージでについてクラスですか?

(あなたがandroid:name=".About"としてそれを宣言するため)しかし、このトラブルシューティングを行うための最善の方法は、Logcat(EclipseとIntelliJの両方がLogcatプラグインを持っている)でのクラッシュの詳細を見ていることです。それは何と言いますか?

0

あなたは、インテントではなくstartActivityメソッドにクラスを渡そうとしています。あなたはIntent Intentを宣言しています。 Intent intent、またはIntent myIntentのようにする必要があります。 int intと同じように、クラスの変数と同じ名前を持つことはできません。

+2

これは確かに読みやすくするためにはるかに優れていますが、Javaは大文字で始まる変数名であることに気付くだけです。 – Gromix

+0

本当ですか?私は実際にそれを知らなかった、それはかなりクールです。あなたはそれが悪い考えであると奨励していると思います。コンパイラの警告はその種の動作を阻止します。 – kcoppock

+1

合意!私はCheckstyleのような静的なコード分析ツールはおそらく不平を言うと思う。 – Gromix

7
Intent Intent = new Intent(this, About.class); 
startActivity(Intent); 

これは

Intent intent = new Intent(this, About.class); 
startActivity(intent); 
+0

これはコードの振る舞いに何の違いもありません –

+0

@ dave.c - 他の5人がそう思うようです。理由を説明してください? – user432209

+1

@user:これはおそらく従うべき命名規則ですが、コンパイラは大文字/小文字や変数の名前付け方法に注意しません(予約語を使用しない限り)。 – Gromix

0

Androidは、例えば、難易あなたAboutクラスを開始したことがありになる必要がありますonCreate()に例外がスローされています。 logcatのスタックトレースを見るとこれを確認できます。根本原因が不明な場合は、スタックトレースを送信してください。

0

のにちょうど観測が、あなたのswitch文を確認するためにlogcatを参照してくださいする必要がありdocumentation

は、デフォルトのケースを破って持っている必要があります。将来のエラーを防ぎ、場合によってはこの問題を解決するのに役立ちます。それ以外にログを投稿する...

1

私はちょうど同じことをしました。つまり、メニューボタンからアクティビティを起動しました。それはうまくいった。クラスと同じ名前の変数の解決に関しては、わかりません。宣言はうまくいくかもしれませんが、その変数への参照は正確ではありません。私の推測です。また、onOptionsItemSelected関数内のすべての制御パスがブール値を返すことを確認してください。

0

これは問題を解決する可能性があります。私は下のサンプルパートを貼り付けます。あなたのAndroidManifestで新しい/ secondアクティビティを作成するのを忘れたと思います。

<application 
    android:allowBackup="true" 
    android:allowTaskReparenting="true" 
    android:hardwareAccelerated="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    <activity 
     android:name="YourPackageName.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    **<activity 
     android:name="YourPackageName.SecondActivity" /> 

    <activity 
     android:name="YourPackageName.ThirdActivity" />** 

</application> 

私はこれがあなたを手伝ってくれることを願っています!

ADDED投稿:

これは私のコードです、動作する必要があります!あなたのメインや他のものに入れてください。あなたのボタンのアクティビティには入れないでください。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.MenuButton_About: 
     Toast.makeText(this, "YourPopupText.", Toast.LENGTH_SHORT).show(); 
        startActivity(new Intent("Name of this activity".this, "Name of the menu button acivity".class)); 
     break; 
    default: 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

は}

使用することもできます:Toast.LENGTH_SHORT - > Toast.LENGTH_LONG

私はこれがあなたつもり助けですね!

0

About Javaアクティビティファイルを確認してください。私はプロジェクトがOKをコンパイルするような同様の問題を抱えていたが、メニューボタンが選択されたときに強制的にシャットダウンする。私が2番目のアクティビティを書き直したとき、すべてがうまくいった!

関連する問題