2014-01-15 26 views
0

我想在選項菜單中調用main中的另一個活動。當我從它自己的選項菜單中調用主要活動時,它將正確工作,但調用另一個意圖會導致異常,並且應用程序將崩潰。我用try和catch,發現它會在到達這條線時崩潰:運行startActivity(intent)時新的意圖崩潰;

startActivity(intent); 

下面是我的主要java文件和應用清單文件。

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ListView listView = (ListView) findViewById(R.id.times_list); 
    TimeTrackerAdapter timeTrackerAdapter = new TimeTrackerAdapter(); 
    listView.setAdapter(timeTrackerAdapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    //getMenuInflater().inflate(R.menu.main, menu); 
    MenuInflater menuInflater = getMenuInflater(); 
    menuInflater.inflate(R.menu.time_list_menu, menu); 
    return true; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item){ 
    if (item.getItemId() == R.id.add_time_menu_item) { 
     Intent intent = new Intent(this, AddTimeActivity.class); 
     try { 
     startActivity(intent); 
     }catch(Exception e){}; 
     //return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public class TimeTrackerAdapter extends BaseAdapter { 

    private ArrayList<TimeRecord> times = new ArrayList<TimeRecord>(); 

    public TimeTrackerAdapter() { 
     times.add(new TimeRecord("38:23", "Feeling good!")); 
     times.add(new TimeRecord("49:01", "Tired. Needed more caffeine")); 
     times.add(new TimeRecord("26:21", "I’m rocking it!")); 
     times.add(new TimeRecord("29:42", 
       "Lost some time on the hills, but pretty good.")); 
    } 

    @Override 
    public int getCount() { 
     return times.size(); 
    } 

    @Override 
    public Object getItem(int index) { 
     return times.get(index); 
    } 

    @Override 
    public long getItemId(int index) { 
     return index; 
    } 

    @Override 
    public View getView(int index, View view, ViewGroup parent) { 
     if (view == null) { 
      LayoutInflater inflater = LayoutInflater.from(parent 
        .getContext()); 
      view = inflater.inflate(R.layout.time_list_item, parent, false); 
     } 
     TimeRecord time = times.get(index); 

     TextView timeTextView = (TextView) view 
       .findViewById(R.id.time_view); 
     timeTextView.setText(time.getTime()); 

     TextView notesTextView = (TextView) view 
       .findViewById(R.id.notes_view); 
     notesTextView.setText(time.getNotes()); 

     return view; 
    } 
} 

public class TimeRecord { 
    private String time; 
    private String notes; 

    public TimeRecord(String time, String notes) { 
     this.time = time; 
     this.notes = notes; 
    } 

    public String getTime() { 
     return time; 
    } 

    public void setTime(String time) { 
     this.time = time; 
    } 

    public String getNotes() { 
     return notes; 
    } 

    public void setNotes(String notes) { 
     this.notes = notes; 
    } 
} 

public class AddTimeActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.add_time); 
    } 

    public boolean onCreateOptionsMenu(Menu m) { 
     super.onCreateOptionsMenu(m); 
     MenuInflater menuInflater = getMenuInflater(); 
     menuInflater.inflate(R.menu.time_list_menu, m); 
     return true; 
    } 
} 

}

,爲manirfest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.test02" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="3" 
    android:targetSdkVersion="18" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.test02.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="com.example.test02.AddTimeActivity" > 
    </activity> 
</application> 

</manifest> 

的logcat:

 
01-15 02:20:01.164: W/dalvikvm(3018): threadid=1: thread exiting with uncaught exception (group=0x41465700) 
01-15 02:20:01.414: E/AndroidRuntime(3018): FATAL EXCEPTION: main 
01-15 02:20:01.414: E/AndroidRuntime(3018): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.test02/com.example.test02.MainActivity$AddTimeActivity}; have you declared this activity in your AndroidManifest.xml? 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Activity.startActivityForResult(Activity.java:3390) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Activity.startActivityForResult(Activity.java:3351) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Activity.startActivity(Activity.java:3587) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.Activity.startActivity(Activity.java:3555) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.example.test02.MainActivity.onMenuItemSelected(MainActivity.java:44) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java??:986) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.??java:735) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:87??4) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.j??ava:166) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.widget.AbsListView$1.run(AbsListView.java:3463) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.os.Handler.handleCallback(Handler.java:730) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.os.Looper.loop(Looper.java:137) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at android.app.ActivityThread.main(ActivityThread.java:5103) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at java.lang.reflect.Method.invokeNative(Native Method) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at java.lang.reflect.Method.invoke(Method.java:525) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
+0

什麼是地球上的錯誤? –

+0

張貼您的logcat –

+0

01-15 02:20:01.164:W/dalvikvm(3018):threadid = 1:線程退出與未捕獲的異常(組= 0x41465700) 01-15 02:20:01.414:E/AndroidRuntime(3018 ):致命例外:main 01-15 02:20:01.414:E/AndroidRuntime(3018):android.content.ActivityNotFoundException:無法找到顯式活動類{com.example.test02/com.example.test02.MainActivity $ AddTimeActivity};你有沒有在你的AndroidManifest.xml中聲明這個活動? –

回答

1

你不把在同一個文件右側的活動?

如果你真的想用活動作爲一個內部類中,你需要把這個在您的Android清單代替另一項活動:

<activity android:name="com.example.test02.MainActivity$AddTimeActivity" > 

我不推薦這雖然。將你的內部類分成兩個不同的類文件。

在包/文件夾中:com.example.test02您需要將其分開並創建兩個文件AddTimeActivity.classMainActivity.class,然後您不需要更改清單中的任何內容。

您是否試過確保包名匹配?你可以在評論中發佈你的進口/包裝名稱,以進一步澄清?

+0

是的,我知道。可以看出,兩個類都在同一個文件中 –

+0

將文件分開放在同一個包中。所以你有你的活動單獨的文件。 – Jerryl15

+0

:)好的謝謝。在解決問題後會做。 –

3

將其添加到AndroidManifest.xml中

<activity 
    android:name="com.example.test02.AddTimeActivity" 
    android:label="@string/app_name"> 
<intent-filter> 
    <action android:name="android.intent.action.AddTimeActivity" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 
+0

仍然崩潰! –

0

在這裏,您創建MainActivity類別內AddTimeActivity類。

注意:在不需要的情況下在一個類中編寫多個嵌套類不是一個好的編碼標準。

遵循一些步驟:

1:只要切從MainActivity AddTimeActivity,並創建一個新的。

第二:在您艙單只是用它作爲:

<activity android:name=".AddTimeActivity" /> 

,並檢查..

0

如果你想在你的應用程序使用的明確意圖,或者如果你想使用再掀活動下面的代碼:

Intent intent_name = new Intent(MainActivity.this,ActivityName.class); 

startActivity(intent_name); 

如果你的應用程序崩潰,那麼你應該修改你的AndroidManifest.xml文件並定義要開始您的活動。

例如:

  • 如果你想開始被命名爲MyActivity,如果你的包名是com.mycomp.myapp,就應該添加下面給出的定義中的活動:

    <activity android:name="com.mycomp.myapp.MyActivity" />