【问题标题】:new intent crashes when running startActivity(intent);运行 startActivity(intent) 时新的意图崩溃;
【发布时间】:2014-01-15 07:11:09
【问题描述】:

我正在尝试从选项菜单的主菜单中调用另一个活动。当我从它自己的选项菜单调用主要活动时,它会正常工作,但调用另一个意图会产生异常并且应用程序将崩溃。我用了try和catch,发现到了这一行就会崩溃:

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;
    }
}

}

对于清单:

<?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: 线程退出未捕获异常 (group=0x41465700) 01-15 02:20:01.414:E/AndroidRuntime(3018):致命异常:主要 01-15 02:20:01.414: E/AndroidRuntime(3018): android.content.ActivityNotFoundException: 找不到明确的活动类 {com.example.test02/com.example.test02.MainActivity$AddTimeActivity};您是否在 AndroidManifest.xml 中声明了此活动? 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1424) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Activity.startActivityForResult(Activity.java:3390) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Activity.startActivityForResult(Activity.java:3351) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Activity.startActivity(Activity.java:3587) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 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): 在 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): 在 com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.j??ava:166) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.widget.AdapterView.performItemClick(AdapterView.java:298) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1100) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:2788) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.widget.AbsListView$1.run(AbsListView.java:3463) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.os.Handler.handleCallback(Handler.java:730) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.os.Handler.dispatchMessage(Handler.java:92) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.os.Looper.loop(Looper.java:137) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.ActivityThread.main(ActivityThread.java:5103) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 java.lang.reflect.Method.invoke(Method.java:525) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

【问题讨论】:

  • 到底是什么错误?
  • 01-15 02:20:01.164: W/dalvikvm(3018): threadid=1: 线程以未捕获的异常退出 (group=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 中声明了此活动?
  • 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628) 01-15 02:20:01.414: E/ AndroidRuntime(3018): 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1424) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 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): 在 android.app.Activity.startActivity(Activity.java :3555) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 com.example.test02.MainActivity.onMenuItemSelected(MainActivity.java:44) 01-15 02:20:01.414: E/AndroidRuntime(3018 ): 在 com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:986) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 com.android.internal.view.menu。 MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在
  • com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 com.android.internal .view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 01-15 02:20:01.414: E/AndroidRuntime(3018): at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java: 166) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在 android.widget.AdapterView.performItemClick(AdapterView.java:298) 01-15 02:20:01.414: E/AndroidRuntime(3018): 在

标签: android android-intent android-activity


【解决方案1】:

将其添加到 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>

【讨论】:

    【解决方案2】:

    您没有将活动放在同一个文件中吗?

    如果您真的想将该活动用作另一个活动中的内部类,则需要将其放入您的 android 清单中:

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

    我不推荐这个。将您的内部类拆分为两个不同的类文件。

    在包/文件夹中:com.example.test02 您需要将其分开并创建两个文件AddTimeActivity.classMainActivity.class,然后您无需更改清单中的任何内容。

    您是否尝试过确保软件包名称匹配?您可以在评论中发布您的导入/包名称以进一步澄清吗?

    【讨论】:

    • 是的,我愿意。可以看出,两个类都在同一个文件中
    • 将文件分开,放在同一个包中。因此,您的活动有单独的文件。
    • 不,不,不,我认为这就是您收到错误的原因。请再次阅读我的帖子。
    • 我猜清单有问题。我在那里定义了新活动
    • 你知道@jerryl15 事实是我在一个教程中(实际上是在一本书中)找到了它,它具有相同的结构,这就是为什么我懒得将它们分开的原因。但让我们看看清单
    【解决方案3】:

    在这里,您在 MainActivity 类中创建 AddTimeActivity 类。

    注意:当不需要时在一个类中编写多个嵌套类不是一个好的编码标准。

    执行一些步骤:

    第一个:只需从 MainActivity 中剪切 AddTimeActivity 并创建一个新的。

    第二个:在您的清单中,只需将其用作:

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

    然后检查..

    【讨论】:

      【解决方案4】:

      如果您想在应用中使用显式 Intent,或者如果您想使用以下代码启动另一个 Activity:

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

      如果您的应用崩溃了,那么您应该编辑您的 AndroidManifest.xml 文件并定义您想要开始的活动。

      例如:

      • 如果您要启动的活动名为MyActivity,并且您的包名称为com.mycomp.myapp,则应添加以下定义:

        &lt;activity android:name="com.mycomp.myapp.MyActivity" /&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        相关资源
        最近更新 更多