(Android)无法从同一包中的一个活动调用另一个活动

3
我花了很长时间试图找到错误,但似乎在网上找不到可行的答案。情况是每次我点击列表中的选项时,LogCat都会产生以下错误:android.content.ActivityNotFoundException: Unable to find explicit activity class。
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.capture.ProcessCapture"
    android:versionCode="1"
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minSdkVersion="7" /><uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <activity android:label="@string/app_name" android:name=".ProcessCaptureActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FileData" android:label="@string/app_name">
        </activity>
        <service android:name=".BackgroundCapture" android:enabled="true" android:process=":Background" android:permission="android.permission.WAKE_LOCK" android:label="@string/app_name"></service>
        <receiver android:name=".BootReceiver" android:label="@string/app_name" android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

ProcessCaptureActivity.java(主要类):

package com.capture.ProcessCapture;
... (all the imports)

public class ProcessCaptureActivity extends ListActivity {
    private File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ProcessCapture/data");
    private String accessedFile;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onResume();
        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, capturedFiles()));
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
              // Get file name:
                accessedFile = ((TextView) view).getText().toString();
                Intent newIntent = new Intent(view.getContext(), FileData.class);
                newIntent.putExtra("filename", accessedFile);
                startActivity(newIntent);
            }
          });
    }

    public void onResume() {
        super.onResume();
        //Timeout for 30min (Using AlarmManager)
        Intent myIntent = new Intent(this, BackgroundCapture.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
    }

    private String[] capturedFiles() {
        return dir.list();
    }

}

FileData.java

package com.capture.ProcessCapture;

... (all the imports)

public class FileData extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        File sdcard = Environment.getExternalStorageDirectory();

        Bundle bundle = this.getIntent().getExtras();
        String filename = bundle.getString("filename");
        File file = new File(sdcard+"/ProcessCapture/data", filename);

        StringBuilder text = new StringBuilder();

        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;

            while((line = br.readLine()) != null) {
                text.append(line);
                text.append('\n');
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        TextView tv = (TextView) findViewById(R.id.file_data);
        tv.setText(text);

        setContentView(R.layout.file_data);
    }

}

完整的LogCat日志:(仅在单击列表项时显示错误)

11-05 10:45:28.743: E/AndroidRuntime(907): FATAL EXCEPTION: main
11-05 10:45:28.743: E/AndroidRuntime(907): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.capture.ProcessCapture/com.capture.ProcessCapture.FileData}; have you declared this activity in your AndroidManifest.xml?
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1405)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.app.Activity.startActivityForResult(Activity.java:2827)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.app.Activity.startActivity(Activity.java:2933)
11-05 10:45:28.743: E/AndroidRuntime(907):  at com.capture.ProcessCapture.ProcessCaptureActivity$1.onItemClick(ProcessCaptureActivity.java:37)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.widget.ListView.performItemClick(ListView.java:3513)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.os.Handler.handleCallback(Handler.java:587)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.os.Looper.loop(Looper.java:123)
11-05 10:45:28.743: E/AndroidRuntime(907):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-05 10:45:28.743: E/AndroidRuntime(907):  at java.lang.reflect.Method.invokeNative(Native Method)
11-05 10:45:28.743: E/AndroidRuntime(907):  at java.lang.reflect.Method.invoke(Method.java:507)
11-05 10:45:28.743: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-05 10:45:28.743: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-05 10:45:28.743: E/AndroidRuntime(907):  at dalvik.system.NativeStart.main(Native Method)

非常感谢!非常抱歉问题有点长 =)
谢谢!提前致谢!对于这个长问题非常抱歉。

1
"com.capture.ProcessCapture" 包名应全部小写,除此之外,你的代码看起来还不错。 - Optimus
1
尝试更改AndroidManifest文件中的完整名称,例如“com.capture.ProcessCapture.FileData”。 - Optimus
1
抱歉,显然我不能自己创建答案...当我改用Ubuntu而不是Windows时,问题被“解决”了 =/ 根本问题在于FileData.java文件中,必须在将文本设置为TextView(tv)之前调用setContentView(R.layout.file_data)。 - pipng13579
嗯...我知道了,你需要先赚取一些声望才能做那件事,这真令人恼火。 - Optimus
希望投票支持你的问题可以帮助提升你的声誉 - 问题提得很好,而且非常详尽,不需要为问题太长而道歉 ;- ) - Amos M. Carpenter
显示剩余2条评论
2个回答

1
(从我的上面的评论中复制)当我使用Ubuntu而不是Windows时,问题“解决”了=/根本问题在FileData.java中,在设置文本到其TextView(tv)之前必须调用setContentView(R.layout.file_data)。
FileData.java的新代码为:
package com.capture.ProcessCapture;

... (all the imports)

public class FileData extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        File sdcard = Environment.getExternalStorageDirectory();

        Bundle bundle = this.getIntent().getExtras();
        String filename = bundle.getString("filename");
        File file = new File(sdcard+"/ProcessCapture/data", filename);

        StringBuilder text = new StringBuilder();

        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;

            while((line = br.readLine()) != null) {
                text.append(line);
                text.append('\n');
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        setContentView(R.layout.file_data);

        TextView tv = (TextView) findViewById(R.id.file_data);
        tv.setText(text);
    }

}

0
请查看这个问题和第一个答案,该答案建议在尝试启动活动的代码周围放置try/catch块,因为有时候实际上并不是活动确实未声明,而是另一个潜在的问题。
如果那样做不起作用,您可以尝试清理和重建项目,然后让Eclipse重新同步(右键单击项目,“Android工具”->“修复项目属性”)。

谢谢您的回复。然而,“修复项目属性”方法没有做出任何可见的改变,堆栈跟踪指向代码的startActivity(newIntent);部分。然而,我仍然找不到解决方案...11-05 12:17:16.092: W/System.err(1251): android.content.ActivityNotFoundException: 找不到显式活动类{com.capture.ProcessCapture/com.capture.ProcessCapture.FileData}; 您是否在AndroidManifest.xml中声明了此活动? - pipng13579
很高兴听到你已经解决了问题。 :-) 有时Eclipse会出现一些问题,这就是为什么我建议尝试清理/构建/同步方法的原因。 - Amos M. Carpenter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接