【问题标题】:Override Activity from Android Library project覆盖 Android 库项目中的 Activity
【发布时间】:2012-07-27 07:57:07
【问题描述】:

我有一个 Android 项目。现在我需要创建该项目的第二版。

会有什么不同:

项目的新版本应该在其中一项活动中具有不同的内容。

我正在考虑创建一个库项目和两个将使用库项目的新项目(project1project2),但我不太明白如何设置它。

我应该将原始项目转换为库,然后创建两个新项目,然后然后?如何让project1使用activity1project2在同一个地方使用activity2

编辑

到目前为止我的设置:

MainProject,一个库有MainActivity.java和ChildActivity.java


AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mainproject">
    <application>
        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ChildActivity">
        </activity>
    </application>
</manifest>

MainActivity.java

   public class MainActivity extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {

            ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ChildActivity.class);
                    startActivity(intent);
                }
            });
        }
}

StandAloneProject:它只有 ChildActivity.java


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.standaloneproject">
    <application>
        <activity
             android:name="com.example.mainproject.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ChildActivity" >
        </activity>
    </application>
</manifest>

我的期望:

当我启动 StandAloneProject 并单击按钮时,我希望启动 StandAloneProject(而不是 MainProject)中的 ChildActivity。

我得到了什么:

当我启动 StandAloneProject 时,我从 MainProject 中看到 MainActivity,单击按钮并获取:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.standaloneproject/com.example.mainproject.ChildActivity}; have you declared this activity in your AndroidManifest.xml?

【问题讨论】:

  • 啊,真的不知道。我猜没有,只是基本的 Eclipse Android 模板。
  • 您是否要为同一个 Android 应用创建 2 个版本?
  • 是的。并且他们会在其中一项活动的内容上有所不同。

标签: android android-activity android-library


【解决方案1】:

问题是如何在 MainActivity.java 中启动子活动。 您需要“手动”确保启动了正确的 ChildActivity。

执行此操作的一种方法是显式设置意图的组件。 Context.getPackageName() 函数返回您正在运行的应用程序的包名称,您可以使用它来识别要启动的 ChildActivity 的“正确实例”。在 MainActivity.java 的 onClick() 处理程序中试试这个:

    Intent intent = new Intent();       
    intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".ChildActivity"));
    startActivity(intent);

【讨论】:

  • 像魅力一样工作。旧答案,但 3 年后我找不到更好的答案。
【解决方案2】:

你的方法是正确的。

  1. 创建您的库项目。
  2. 创建一个新项目,创建您需要的活动并将您的库项目添加到其中。
  3. 将 AndroidManifest.xml 从库项目复制到新项目中,但指向与项目活动不同的活动,而不是库项目中的活动。

【讨论】:

  • 我的意思是,我的图书馆项目不会知道其他项目中的活动。如何在库项目中保留该逻辑?
  • 通过快速修复我的意思是您将 MyActivity 类复制到您的新项目中,并且在新项目中您(在清单中)引用新的 MyActivity 类而不是库中的类。该库仍将读取旧的 MyActivity 类。
  • 你是如何为独立项目清单指向你的库项目的?您需要使用完整的包名称指向所有库活动名称="com.your.libary.projects.packagename.youractivity"
  • android:name="com.example.mainproject.MainActivity"> 在这里。子项目显示来自库项目的活动。但它无法找到自己的活动。
  • 如果您复制了项目,可能导入错误。尝试删除/读取活动的所有导入
【解决方案3】:

你在正确的轨道上。设置一个库项目和两个包含 lib 项目的标准 android 项目。 请记住将清单活动复制到新项目。当您想要分离活动时,您可以从您的 lib 项目中扩展这些活动。 project1: MyActivty 扩展了 Activit1 .. 项目 2 MyActivit

【讨论】:

  • 一个快速修复将只是替换启动意图膨胀的活动。 :)
  • 我试图清除一些东西。图书馆项目没有参考其他项目。 Project1 和 Project2 包括库项目(比如包括一个 jar)。如果您想要与库项目不同的活动行为,则必须从库项目扩展项目内的目标活动并覆盖不同的方法。
猜你喜欢
  • 2011-09-27
  • 2020-09-18
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多