2012-08-23 43 views
7

Tôi đang sử dụng mã này để nhảy trở lại trong hoạt động ngăn xếp (chủ yếu để chuyển sang Hoạt động nhà):Làm thế nào để gắn thẻ Hoạt động

Intent goTo = new Intent(this, HomeActivity.class); 
goTo.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(goTo); 


Vì vậy, tôi tạo Ý định mới và thiết lập "mục tiêu" để HomeActivity đó là trong ngăn xếp Hoạt động, vì vậy toàn bộ ngăn xếp sẽ bị xóa khỏi đầu trang chủ này.
Bây giờ tôi cần trường hợp sử dụng hơi khác. Tôi có ví dụ năm Hoạt động A-B-C-D-E (A bắt đầu B, vv) trên ngăn xếp. Bây giờ tôi cần phải nhảy từ E đến C hoặc B tùy thuộc vào những gì người dùng chọn. Vấn đề là các hoạt động A, B, C, D, E có cùng một lớp. Vì vậy, tôi không thể sử dụng ví dụ ở trên vì tôi không biết cách nhắm mục tiêu Hoạt động đó.
Vì vậy, câu hỏi đặt ra là nếu có bất kỳ cách nào để "hoạt động thẻ" hoặc thao tác với ngăn xếp.
Cảm ơn!

+0

nếu A và E giống nhau, thay vì gọi E tại sao bạn không gọi hoạt động A từ lịch sử ?? – Ishtiaq

+0

Tôi đã chỉnh sửa câu hỏi của mình để làm rõ hơn. Tất cả các hoạt động đều có cùng lớp. – Warlock

+0

Tôi không thể hiểu được vấn đề của bạn. Vui lòng cho tôi biết, điều gì là xấu? –

Trả lời

0

tốt nhất và các giải pháp dễ nhất (cho đến nay) sẽ được sử dụng và mảnh vỡ FragmentManager. Sau đó, hãy gắn thẻ từng Phân đoạn và sử dụng FragmentManager. Chỉ sử dụng Hoạt động có thể rất khó có kết quả gần như giống nhau.

+0

Tôi đã đề cập đến điều này trong câu trả lời của mình! :) – Joe

+0

Cách tiếp cận của bạn rất khác. Nhưng cảm ơn ý tưởng đó! ;-) – Warlock

1

Bạn chỉ có thể giữ một điều kiện trong bản Tuyên Bố của bạn nếu người dùng chọn mục này vượt qua ý định lớp B và nếu người dùng chọn mục mà vượt qua ý định lớp C

+0

Vấn đề là tất cả các hoạt động đều có cùng một lớp. – Warlock

1

Thêm extra để ý định của bạn mà sẽ chỉ hoạt động phải làm gì. Ví dụ:

intent.putExtra("STATE", 1); 

Và nhận giá trị này ở trênTạo hoạt động của bạn.

getIntent().getExtras() 
+0

Imho chỉ làm thế nào để sử dụng này approache là kết hợp nó với startActivityForResult/onActivityResult vv nhưng tôi hy vọng có thể có cách đơn giản hơn để làm điều đó. Tôi có thể có mười hoạt động như đã đề cập ở trên để onActivityResult sẽ được gọi đến nhiều lần ... – Warlock

+0

Nếu vấn đề chính là cùng một lớp cho tất cả các hoạt động, giải pháp có thể đơn giản. Tạo một lớp cơ sở sau đó mở rộng nó nhiều lần tùy theo nhu cầu của bạn và khởi tạo các lớp khác nhau. Nhưng tôi nghĩ đó là một cách tiếp cận kỳ lạ. Tốt hơn hãy tạo một máy trạng thái đơn giản và không khởi động lại cùng một hoạt động 100 lần ... – Dimanoid

2

Tôi đã không thử nó bản thân mình, nhưng tôi nghĩ rằng lựa chọn tốt nhất sẽ được cấu trúc lại ứng dụng của bạn sử dụng một chồng Fragment s trong một đơn Activity (vì bạn có thể sau đó dễ dàng quản lý các backstack sử dụng được cung cấp addToBackStack()popBackStack() phương pháp). Về cơ bản, điều này liên quan đến việc di chuyển hầu hết mã trong Activity của bạn thành một Fragment và sau đó thêm mã thao tác backstack vào Activity). Bạn có thể xem mã cho FragmentBreadCrumbs (với API 11+) hoặc mã cho HanselAndGretel (để sử dụng với thư viện tương thích) để xem cách thực hiện điều này.

Tuy nhiên, nếu bạn muốn tiếp tục sử dụng phương pháp đa hoạt động hiện tại của mình, sau đây là một số mã tôi đã đưa ra để minh họa cách bạn có thể thực hiện việc này.

Đầu tiên, thêm một số lớp bên trong để đặt bí danh Hoạt động hiện tại của bạn và đặt các lớp này thành danh sách chuỗi (chú ý phương pháp đơn giản getSequencedActivityIntent() mà tôi đã viết). mỗi lớp trong chuỗi có giá trị thẻ tùy ý?):

public class MyActivity extends Activity { 

    public static class A extends MyActivity {} 
    public static class B extends MyActivity {} 
    public static class C extends MyActivity {} 
    public static class D extends MyActivity {} 
    public static class E extends MyActivity {} 
    public static class F extends MyActivity {} 
    public static class G extends MyActivity {} 
    public static class H extends MyActivity {} 
    public static class I extends MyActivity {} 
    public static class J extends MyActivity {} 

    private final static List<Class<?>> SEQUENCE = Arrays.asList(new Class<?>[] { 
      A.class, B.class, C.class, D.class, E.class, 
      F.class, G.class, H.class, I.class, J.class, 
    }); 

    private Intent getSequencedActivityIntent(int step) { 
     final int current = SEQUENCE.indexOf(this.getClass()); 
     if (current == -1) new Intent(this, SEQUENCE.get(0)); 

     final int target = current + step; 
     if (target < 0 || target > SEQUENCE.size() - 1) return null; 

     return new Intent(this, SEQUENCE.get(target)); 
    } 

    // the rest of your activity code 
} 

Đừng quên thêm mục nhập vào AndroidManifest của bạn.tập tin xml quá (singleTop là tùy chọn - nó sẽ ngăn chặn các trường hợp Hoạt động trong ngăn xếp được tạo ra một lần nữa khi đưa trở lại phía trước):

<activity android:name=".MyActivity$A" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$B" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$C" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$D" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$E" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$F" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$G" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$H" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$I" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$J" android:launchMode="singleTop" /> 

Bây giờ, bất cứ khi nào bạn cần để bắt đầu một "top" mới thể hiện của Hoạt động của bạn, bạn có thể làm điều gì đó như:

final Intent intent = getSequencedActivityIntent(+1); 
    if (intent == null) return; 
    intent.putExtra("dataset", dataSet); 
    startActivity(intent); 

Và khi bạn cần phải quay trở lại một trong những ví dụ trong backstack bạn có thể làm:

final Intent intent = getSequencedActivityIntent(- stepBack); 
    if (intent == null) return; 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
1

như tôi underst và Android chỉ nhắm mục tiêu vào lớp hoạt động chứ không phải là một hoạt động cụ thể. Vì vậy, tôi nghĩ rằng bạn sẽ không thể làm những gì bạn muốn bằng cách thêm một số cờ trên Intent.

Tôi nghĩ rằng cách tiếp cận đơn giản nhất sẽ được thực hiện nó trên của riêng bạn bằng một cái gì đó như thế này

a) Tạo một số singleton và có một thành viên trong đó mà chỉ ra trường hợp hoạt động mà bạn muốn quay trở lại (như hoạt động ví dụ B). Có lẽ, bạn sẽ phải lưu trữ tất cả các hoạt động trong một số danh sách để có thể nhận được ví dụ về một số hoạt động được đưa ra trước đó.

b) Override onResume về mọi hoạt động và nó thực hiện kiểm tra sau:

if (SomeSingleton.getTargetActivity() != null && this != SomeSingleton.getTargetActivity()) 
    finish(); 
else 
    SomeSingleton.setTargetActivity(null); 

c) Ngay khi bạn cần phải trả lại từ E làm

SomeSingleton.setTargetActivity(B); 
finish(); 

này sẽ kết thúc hoạt động đầu (đó là E) và gọi onResume trên hoạt động D. Nó sẽ kiểm tra xem nó là mục tiêu. Nếu không thì nó sẽ đóng nó và hệ thống sẽ gọi onResume trên hoạt động C và cứ thế.

2

Bạn có thể chỉ số hoạt động của bạn mà không cần phải lo lắng về việc xử lý tất cả các chuỗi onActivityResult s sử dụng Hoạt động siêu mà bạn mở rộng trong tất cả các hoạt động của bạn

Dưới đây là một thực hiện (tôi không thử nghiệm nó) nhưng nếu bạn mở rộng SuperActivity này trong tất cả các Hoạt động của bạn, bạn có thể gọi fallBackToActivity(int) cho bất kỳ hoạt động nào sử dụng chỉ mục của nó và mỗi hoạt động hiện có getIndex(). Bạn có thể sử dụng nó để dự phòng để một chỉ số tương đối như getIndex()-3

package sherif.android.stack.overflow; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class SuperActivity extends Activity { 
    private static String EXTRA_INDEX = "SUPER_INDEX"; 
    private static int RESULT_FALLBACK = 0x123456; 
    private int index; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(getIntent()!=null) { 
      index = getIntent().getIntExtra(EXTRA_INDEX, -1) + 1; 
     } 
    } 
    protected final int getIndex() { 
     return index; 
    } 
    protected final void fallBackToActivity(int index) { 
     Intent intent = new Intent(); 
     intent.putExtra(EXTRA_INDEX, index); 
     setResult(RESULT_FALLBACK, intent); 
     finish(); 
    } 
    @Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     intent.putExtra(EXTRA_INDEX, getIndex()); 
     super.startActivityForResult(intent, requestCode); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == RESULT_FALLBACK) { 
      if(data.getIntExtra(EXTRA_INDEX, -1)!=getIndex()) { 
       setResult(RESULT_FALLBACK, data); 
       finish(); 
      } 
     } 
    } 
} 
1

Nếu bạn muốn sử dụng một cách tiếp cận bất thường, hoặc một số khó khăn một lần, bạn sẽ có nhiều vấn đề hơn sau đó. Tôi nghĩ bạn có thể

Xác định lớp con trừu tượng/không trừu tượng của Hoạt động và xác định mọi thứ bạn muốn. Nếu các lớp khác là chính xác giống như lớp trên, vì vậy chỉ cần phân lớp từ nó và không làm gì hơn. Nhưng nếu các lớp (Hoạt động) có thể khác nhau, bạn có thể cung cấp các phương thức trừu tượng/không trừu tượng để xác định các khả năng bổ sung.

Vì vậy

  • Bạn viết một mã tái sử dụng cho tất cả các hoạt động,
  • Bạn hành động bình thường, do đó bạn sẽ nhận được kết quả tốt
  • Bạn có thể kiểm soát mọi thứ chuyên các hoạt động của bạn
  • Bạn có thể kiểm soát ngăn xếp sử dụng tệp kê khai
  • và hơn thế nữa

để biết thông tin chi tiết xem dưới đây mã: Hoạt động

phụ huynh:

public abstract class AbstractActivity extends Activity { 

    AbstractActivity currentActivity; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     currentActivity = this; 
     someProtectedMethod(); 
     commonMethod(); 
     // etc... 

     /* event handling */ 
     Button btn_first = (Button) findViewById(R.id.btn_first); 
     Button btn_second = (Button) findViewById(R.id.btn_second); 

     btn_first.setOnClickListener(new OnClickListener() { 

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

     btn_second.setOnClickListener(new OnClickListener() { 

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

    } 


    /** you must override it, so you can control specified things safe */ 
    protected abstract void someProtectedMethod(); 


    protected void commonMethod() { 
     Log.i("LOG", "Hello From " + getClass().getName()); 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     //some statement that work in all activities to 
     Log.i("LOG", "On Resume: " + getClass().getName()); 
    } 
} 

Hoạt động đầu tiên:

public class FirstActivity extends AbstractActivity { 

    @Override 
    protected void someProtectedMethod() { 
     Log.i("LOG", "Special Action From First Activity"); 
    } 
} 

Hoạt động thứ hai:

public class SecondActivity extends AbstractActivity { 

    @Override 
    protected void someProtectedMethod() { 
     Log.i("LOG", "Special Action From Second Activity"); 
    } 
} 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 


    <Button 
     android:id="@+id/btn_first" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.5" 
     android:text="Open First Activity" /> 

    <Button 
     android:id="@+id/btn_second" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.5" 
     android:text="Open Second Activity" /> 

</LinearLayout> 

Manifest:

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

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

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".FirstActivity" 
      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=".SecondActivity" 
      android:label="@string/app_name" > 
     </activity> 

    </application> 

</manifest> 
Các vấn đề liên quan