2011-08-07 29 views
10

sau một tìm kiếm dài Tôi không thể tìm thấy bất kỳ giải pháp thích hợp nào. Tôi có một Dự án Android-Thư viện với gần như tất cả mã cho ứng dụng. Từ hoạt động chính trong dự án thư viện, tôi bắt đầu Intent to en explicit Activity A. Trong dự án có nguồn gốc của tôi, sử dụng Dự án thư viện, tôi đã mở rộng Hoạt động A này và thêm một số mã mới. Vấn đề là Superclass của Activity A sẽ trả lời và không phải là lớp dẫn xuất.Bắt đầu Hoạt động từ Android-Library-Project

Trong tệp kê khai của Dự án mới sử dụng dự án thư viện, tôi đã khai báo Hoạt động mới với gói mới.

Đây là cuộc gọi Ý định từ Dự án Thư viện:

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

Đây là lớp AndroidActivity có nguồn gốc:

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
      ... 

tôi không thể để có được phương pháp onCreate

Các Tệp kê khai từ Dự án thư viện:

<?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> 

Và ở đây Manifest từ Dự án mới:

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

Vì vậy, tôi có:

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

tôi không muốn làm điều đó thay đổi nhiều đến dự án thư viện beacuase một dự án thứ ba nên sử dụng mã hiện có với AndroidActivity

ALl không hoạt động khác. Ví dụ, bố trí thay đổi được sử dụng từ dự án mới.

Tôi làm cách nào để xử lý sự cố đó? Có thể thay đổi trong Tệp kê khai từ dự án mới mà tôi tuyên bố rằng hoạt động mới nên được gọi thay vì siêu lớp?

Cảm ơn trước!

Trả lời

0

Trong dự án mới của bạn, bạn có thể sử dụng tên khác thay vì AndroidActivity. Nếu bạn không muốn làm điều đó, tên đầy đủ của AndroidActivity thứ hai trong tệp kê khai sẽ giải quyết được sự cố của bạn. Bạn có lẽ đang rối tung lên với các gói một chút, ở đâu đó.

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

nên

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

Tôi có nghĩa là, các AndroidActivity. Trong một số cách, bạn đang chọn lên lớp hoạt động sai từ gói sai.

+2

Trong dự án mới, tôi không có lớp MainActivity. Tôi đang trỏ đến dự án thư viện. Chỉ AndroidActivity có một số thay đổi và đó là lý do tại sao tôi đã mở rộng nó. – treimy

1

Khi bạn làm điều này trong dự án thư viện của bạn

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

AndroidActivity đề cập đến các thư viện của AndroidActivity dự án: Một dự án không biết về các dự án bên ngoài khác, trừ khi bạn bao gồm chúng như là một thư viện. Chỉ cần kiểm tra hàng nhập của bạn, bạn đang nhập AndroidActivity và hướng dẫn Android chạy nó.

nào bằng cách đó là rõ ràng, nó sẽ là một mẫu thiết kế xấu nếu dự án thư viện phải biết về các dự án có nguồn gốc

Một giải pháp dễ dàng là để ghi đè lên các hoạt động triển khai trên các dự án có nguồn gốc, một cái gì đó như thế này :

THƯ VIỆN dự án Hoạt động:

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

Hoạt động dự án có nguồn gốc của bạn:

@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 

    . 
    . 
} 

Vì vậy, khi bạn gọi runMyActivity() từ bất cứ đâu, nó sẽ thực hiện hàm overriden (miễn là hoạt động khởi động mở rộng hoạt động của dự án thư viện và ghi đè phương thức đó). Và trong bối cảnh hàm overriden, AndroidActivity.class sẽ là hoạt động có nguồn gốc của bạn (hoặc cái khác, bạn có thể nhập bất kỳ thứ gì trong số chúng vì ở đây bạn có quyền truy cập vào các hoạt động có nguồn gốc AND của dự án thư viện).

Các vấn đề liên quan