2014-01-15 4 views
0

Я пытаюсь вызвать другое действие из основного в меню опций. когда я вызываю основное действие из своего собственного меню параметров, он будет правильно работать, но вызов другого намерения сделает исключение, и приложение выйдет из строя. Я попытаться поймать и обнаружили, что это приведет к краху, когда он достигает этой линии:новые намерения сбрасываются при запуске startActivity (намерение);

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

Опубликовать свой логарифм –

+0

01-15 02: 20: 01.164: W/dalvikvm (3018): threadid = 1: поток, выходящий с неперехваченным исключением (группа = 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: не удается найти явный класс активности {com.example.test02/com.example.test02.MainActivity $ AddTimeActivity}; Вы объявили эту активность в своем AndroidManifest.xml? –

ответ

1

Вы не прикладывая деятельность в том же правом файла?

Если вы действительно хотите использовать деятельность в качестве внутреннего класса в другой деятельности, вы должны сделать это в вашем андроиде манифеста вместо:

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

Я не рекомендую это, хотя. Разделите свои внутренние классы на два разных файла класса.

В пакете/папке: com.example.test02 необходимо отделить его и сделать два файла AddTimeActivity.class и MainActivity.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

Здесь вы создаете класс AddTimeActivity внутри класса MainActivity.

Примечание: пишите несколько вложенных классов внутри одного класса, если они не нужны, не являются хорошим стандартом кодирования.

Выполните несколько шагов:

первый: Просто вырезать AddTimeActivity из MainActivity и создать новый.

второй: В вы проявляете просто использовать его как:

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

Смежные вопросы