Начало работы с Android-Library-Project - PullRequest
11 голосов
/ 07 августа 2011

после долгих поисков я не смог найти подходящего решения. У меня есть проект Android-библиотеки с почти всем кодом для приложения. Начиная с основного задания в библиотечном проекте, я начинаю Намерение на явное задание А. В моем производном проекте, который использует библиотеку «Проект», я расширил это задание А и добавил новый код. Проблема в том, что ответит суперкласс действия A, а не производный класс.

В манифесте нового проекта, в котором используется проект библиотеки, я объявил новую активность с новым пакетом.

Вот намеренный звонок из Библиотечного проекта:

Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
startActivity(i);

Вот производный класс AndroidActivity:

public class AndroidActivity extends de.app.library.activities.AndroidActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
            ...

Я не могу получить доступ к методу onCreate

Манифест из библиотечного проекта:

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

<uses-sdk android:minSdkVersion="4" />

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name">

    <activity android:name=".activities.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=".activities.AndroidActivity" android:label="@string/act_android" />
</application>

А вот и Манифест из нового Проекта:

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

<uses-sdk android:minSdkVersion="4" />

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name">


    <activity android:name="de.app.library.activities.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=".activities.LernenActivity" android:label="@string/act_lernen" />

Итак, у меня есть:

de.app.library.activities.AndroidActivity  and
de.app.free.activities.AndroidActivity

Я не хотел вносить столько изменений в библиотечный проект, потому что третий проект должен использовать существующий код с нетронутой AndroidActivity

Все остальное у меня хорошо работает. Например, измененные макеты используются из нового проекта.

Как я могу справиться с этой проблемой? Может быть, изменения в манифесте нового проекта, в котором я заявляю, что вместо суперкласса следует вызывать новое действие?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2014

Когда вы делаете это в своем проекте библиотеки

 Intent i = new Intent(getApplicationContext(), AndroidActivity.class);

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

Что, кстати, очевидно, будет плохим шаблоном проектирования, если проект библиотеки должен будет знать о производных проектах

Простое решение состоит в том, чтобы переопределить действие, запускаемое в производном проекте, что-то вроде этого:

Упражнение проекта Libary:

public void runMyActivity() {
    Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
    // You are on the library project, so you can refer to the activities created in it.
    // the only AndroidActivity known here is the library project's
    .
    .
}

Активность вашего производного проекта:

@Override
public void runMyActivity() {
    // You are now on the derived project, so you can refer to 
    // the activities created in it, and also to the library project's. You
    // just import the package name of the desired activity or use fully qualified
    // names

    Intent i1 = new Intent(getApplicationContext(), AndroidActivity.class);
    // this one will use the activity in the imports
    Intent i2 = new Intent(getApplicationContext(), de.app.libarary.AndroidActivity.class);
    // use the activity from the library project
    Intent i3 = new Intent(getApplicationContext(), de.app.free.AndroidActivity.class);
    // use the activity from the derived project

    .
    .
}

Поэтому, когда вы вызываете runMyActivity () из любого места, он выполняет переопределенную функцию (при условии, что действие при запуске расширяет активность проекта библиотеки и переопределяет этот метод).А в контексте переопределенной функции AndroidActivity.class будет вашим производным действием (или другим, вы можете импортировать любое из них, потому что здесь у вас есть доступ к производным действиям И проекту библиотеки).

0 голосов
/ 08 августа 2011

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

activity android:name="de.app.library.activities.AndroidActivity"

должно быть

activity android:name="de.app.free.activities.AndroidActivity"

Я имел в виду AndroidActivity. В некотором смысле, вы выбираете неправильный класс активности из неправильного пакета.

...