2012-01-11 21 views
61

tôi cần phải tạo ra một lớp cơ sở kéo dài Activity mà hiện một số tác vụ thông thường trong ứng dụng của tôi và mở rộng hoạt động tôi từ nó, trong các hình thức sau đây:android cách tạo Hoạt động của riêng tôi và mở rộng nó?

BaseActivity công mở rộng Hoạt động {....}

SubActivity công cộng kéo dài BaseActivity {...}

trong SubActivity Tôi cần phải cung cấp giá trị cho một số biến và các thành phần giao diện người dùng quy định tại BaseActivity, tôi có thể cần phải xác định một cách bố trí khác nhau cho SubActivity theo một số giá trị cờ, cũng (trong SubActivity) Tôi muốn thực hiện AsyncTask được xác định trong BaseActivity.

là điều này có thể? nếu có, có bất kỳ hướng dẫn nào có thể hữu ích không? cảm ơn bạn trước

Trả lời

127

Chính xác bạn đang cố gắng đạt được điều gì? Có hai hoạt động khác nhau với một giao diện phổ biến, ngoại trừ một số biến hoặc một phần của bố cục?

Trong trường hợp này, tôi đề xuất có hoạt động trừu tượng cơ bản và hai lớp con được thừa kế cụ thể. Bạn xác định tất cả các hành vi phổ biến trong hoạt động cơ sở, và có các phương thức trừu tượng cho các khác biệt, mà sau đó bạn ghi đè lên trong các triển khai thực tế của mình.

Ví dụ, đối với hai hoạt động với nguồn lực bố trí khác nhau:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 
    } 

    protected abstract int getLayoutResourceId(); 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // do extra stuff on your resources, using findViewById on your layout_for_activity1 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.layout_for_activity1; 
    } 
} 

Bạn có thể có rất nhiều phương pháp trừu tượng hơn, cho mỗi bit bạn muốn cụ thể đối với các lớp con của bạn.

Thực hiện điều đó, theo ý kiến ​​của tôi, tốt hơn rất nhiều so với việc có một lớp con cụ thể cho một lớp siêu lớp cụ thể: có thể dẫn đến nhiều vấn đề và thường khó gỡ lỗi.

+0

cảm ơn bạn rất nhiều, đây chính xác là những gì tôi cần. – user173488

+1

Không có vấn đề P) Ghi nhớ Tôi đã mã hóa nhanh chóng trong trình soạn thảo StackOverflow, có thể có lỗi cú pháp – Guillaume

+0

cảm ơn, tôi đã lấy ý tưởng và áp dụng nó cho các chức năng khác, dữ liệu để vượt qua và AsyncTask trong BaseActivity, nó hoạt động tốt. – user173488

5

Có thể, bạn chỉ cần ghi nhớ các quy tắc thừa kế cơ bản. Bạn sẽ kế thừa hoạt động bên trong AsyncTask và các thuộc tính được định nghĩa trong BaseActivity nếu bạn bảo vệ chúng thay vì riêng tư. Từ những gì tôi thấy bây giờ tôi nghĩ bạn nên làm cho BaseActivity là một lớp trừu tượng, vì chỉ các cá thể của các phép con thực sự mới được sử dụng.

Bạn chỉ nên bắt đầu và dùng thử, nó sẽ đến và hoạt động dễ dàng hơn bạn nghĩ. Nếu bạn vấp phải bất kỳ vấn đề gì, chỉ cần hỏi.

2

Tôi đã tìm thấy một cách dễ dàng hơn cho giải pháp của @ Guillaume. Đặt ContentView chỉ một lần trong BaseActivity của bạn và không đặt nó trong các hoạt động mà mở rộng nó:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(activity_main); 
    } 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // setContentView(activity_activity1) // Do NOT call this. 
    } 
} 
+1

có vẻ hợp pháp, nhưng tôi có một số lo ngại, người dùng sẽ chỉ sử dụng một bố cục ... nếu tôi có 3 lượt xem phổ biến trong 3 hoạt động khác biệt nhưng khác với tất cả bố cục khác nhau thì tôi đoán giải pháp này sẽ đánh bại mục đích.... – Juni

2

Câu hỏi này đã có câu trả lời rất tốt.
Câu trả lời của tôi dành cho những người đang tìm kiếm một số ví dụ làm việc.
Dưới đây là toàn bộ lao động ->CODE

enter image description here
Chúng tôi không làm bất cứ điều gì mới ở đây, nó cũng giống như bất kỳ kịch bản thừa kế khác (Bạn muốn có một số hành vi phổ biến ở nhiều nơi nhưng bạn muốn viết rằng hành vi chỉ một lần).

ADVANTAGE: Nó cung cấp tốt hơn khả năng đọc mã, bảo trì và blah blah.But không sau những -ibility, Họ sẽ không quan trọng với bạn nếu não của bạn chạy như một con linh dương.
Chúng tôi theo sau quyền lực thực sự của thừa kế “CONTROL”. (Đó là những gì xảy ra trong cuộc sống thực. Cha mẹ kiểm soát con :)).

Trong ví dụ của tôi, tôi có hai Hoạt động MainActivity và OtherActivity. Cả hai Hoạt động có bố cục khác nhau nhưng tôi muốn cả hai đều bắt đầu với một số hoạt ảnh hoặc một số thông điệp chào mừng.

Nhiệm vụ đầu tiên của chúng tôi là tìm ra hành vi chung. tại đây -> Bắt đầu Hoạt động với hoạt ảnh.
Chúng tôi đã tìm thấy "điều" chung, bây giờ chúng tôi sẽ viết hành vi đó trong BaseClass (AnimationActivity).
MainActivity và OtherActivity sẽ kế thừa AnimationActivity.

Vì vậy, mã sẽ trông như `

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

hoạt động Child

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

phương pháp thiết kế này cung cấp rất nhiều của Điều khiểnTính linh hoạt (POWER OF MODIFIER).

1) KIỂM SOÁT: Giữ phương thức hoạt hình bên trong onCreate() Khi bạn quyết định rằng Hoạt động sẽ được bắt đầu bằng Hoạt ảnh. Giữ phương pháp của bạn trong phương thức onCreate (Bundle bundle). Bây giờ chỉ bằng cách thay đổi công cụ sửa đổi, bạn có thể kiểm soát hoạt động con.
Nếu bạn duy trì công cụ sửa đổi là
final: Hoạt động của trẻ em sẽ bắt đầu bằng Hoạt ảnh gốc.
trừu tượng: Hoạt động của trẻ em sẽ phải cung cấp hoạt ảnh của riêng chúng.
không có công cụ sửa đổi: Hoạt động của trẻ có thể có hoạt ảnh của riêng chúng bằng cách ghi đè phương thức hoạt ảnh, Nếu không trẻ sẽ có hoạt ảnh gốc.

2) Tính linh hoạt: Không giữ phương thức hoạt ảnh bên trong onCreate() Bạn có thể cung cấp cho trẻ hoạt động linh hoạt bằng cách không giữ phương thức hoạt ảnh bên trong onCreate (Gói bó). Các hoạt động hiện tại có thể linh hoạt để có Hoạt ảnh gốc hoặc hoạt ảnh của riêng chúng hoặc không có hoạt ảnh nào cả.
Hy vọng điều đó sẽ hữu ích.
Học tập vui vẻ.

`

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