2011-10-29 38 views
6

Trong ứng dụng Android của tôi, tôi có hai màn hình/hoạt động cấp cao nhất nhưng có liên quan. Tôi muốn có hai biểu tượng khởi chạy riêng biệt cho chúng, nhưng cho phép người dùng "vuốt" giữa chúng, như với ViewPager.Vuốt giữa các hoạt động trên Android với ViewPager

Các tùy chọn tôi thấy là:

  1. Thực hiện hai hoạt động riêng biệt, và bằng cách nào đó cho phép vuốt giữa chúng. Vấn đề là ViewPager không thể được sử dụng với hai hoạt động riêng biệt.

  2. Triển khai một hoạt động đơn lẻ với hai đoạn và sử dụng ViewPager để chuyển đổi giữa chúng. Việc vuốt rất đơn giản, nhưng có thể có hai bệ phóng tự động chuyển sang phân đoạn chính xác không?

Có một trong hai tùy chọn trên có thể thực hiện được không, hoặc có điều gì khác tôi có thể thử không?

Trả lời

1

Giải pháp 1: Bạn có thể vuốt về mặt bắt đầu Hoạt động khác mỗi lần. Trong trường hợp này, bạn nên khắc phục hoạt ảnh chuyển tiếp cho hai hoạt động để có hiệu ứng "swiping" và đặt hai hoạt động là SingleTask để không có nhiều cá thể trong tác vụ của bạn (do đó bạn nên triển khai phương thức onNewIntent()) .

Giải pháp 2: Yeap điều này là có thể. Dựa trên biểu tượng trình khởi chạy, bạn nên bắt đầu và hiển thị đoạn phù hợp mỗi lần và sau đó sử dụng vuốt để thay đổi chế độ xem.

Hy vọng điều này sẽ hữu ích!

+0

Đối với giải pháp 2, cách bạn phát hiện biểu tượng trình khởi chạy nào đã được sử dụng? Thông tin này có xuất hiện trong mục đích khởi chạy không? – Ralf

+0

Bạn có thể thêm thêm vào mục đích bắt đầu hoạt động xử lý các đoạn. –

+0

Tôi muốn hai bệ phóng màn hình chính bắt đầu hoạt động, vì vậy tôi không thể thêm bất kỳ tính năng bổ sung nào vào những mục đích đó. – Ralf

2

Tôi đã thử giải pháp hai, nhưng vấn đề là một hoạt động không thể phát hiện biểu tượng trình khởi chạy nào đã được sử dụng (hãy cho tôi biết nếu tôi sai).

Giải pháp của tôi là thêm hai hoạt động "giả", sau đó khởi chạy hoạt động chính có số "trang" chính xác. Khó khăn với cách tiếp cận này là để xử lý các nhiệm vụ ngăn xếp đúng cách. Khi trình khởi chạy được chọn, hoạt động giả phải được khởi chạy và nó phải gửi ý định đến hoạt động chính. Android cố gắng hết sức để ngăn bạn thực hiện việc này và chỉ mang lại hoạt động cuối cùng lên mặt trước.

Đây là tốt nhất mà tôi có thể đưa ra:

Các hoạt động giả (tương tự cho LaunchActivity2):

public class LaunchActivity1 extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent newIntent = new Intent(this, MainActivity.class); 
     newIntent.putExtra(MainActivity.EXTRA_PAGE, 1); 
     newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(newIntent); 
     finish(); 
    } 
} 

Trong hoạt động chính:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 
    ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager); 
    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager())); 

    int page = getIntent().getIntExtra(EXTRA_PAGE, -1); 
    if(page >= 0 && page <= NUM_ITEMS) 
     viewPager.setCurrentItem(page); 
} 

public void onNewIntent(Intent intent) { 
    if(intent.hasExtra(EXTRA_PAGE)) { 
     int page = intent.getIntExtra(EXTRA_PAGE, -1); 
     ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager); 
     if(page >= 0 && page <= NUM_ITEMS) 
      viewPager.setCurrentItem(page); 
    } 
} 

AndroidManifest.xml:

<!-- LaunchActivity2 is similar --> 
    <activity android:name=".LaunchActivity1" android:label="Launch 1" 
       android:clearTaskOnLaunch="true" 
       android:noHistory="true" 
       android:taskAffinity="Launch1" 
       android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <activity android:name=".MainActivity" 
       android:label="My App" 
       android:clearTaskOnLaunch="true" 
       android:finishOnTaskLaunch="true" 
       android:launchMode="singleTask" 
       android:taskAffinity="MyApp"> 
    </activity> 

Vấn đề với các mối quan hệ công việc khác nhau là cả hai bệ phóng, cũng như nhiệm vụ chính, xuất hiện trong danh sách "Ứng dụng gần đây".

Tôi sẽ không đề xuất phương pháp này cho bất kỳ ai khác - thay vì chỉ sử dụng một biểu tượng trình khởi chạy.

0

Tôi biết điều này là cũ, nhưng đó là câu hỏi đầu tiên tôi gặp phải khi tôi tìm cùng một vấn đề.

Bạn có thể tìm giải pháp ở đó: ViewPager for multiple Activities, sử dụng Phân đoạn ...(nó cũng nằm trong thư viện hỗ trợ nếu bạn cần chạy trên các phiên bản trước của Android)

0

Tôi sẽ tìm giải pháp 2, không cần các hoạt động giả, nó sẽ làm chậm hoạt động của ứng dụng, thay vào đó bạn có thể thêm hoạt động-bí danh trong Manifest của bạn, như thế này:

<activity-alias 
     android:name=".MySecondLauncher" 
     android:exported="true" 
     android:icon="@drawable/my_second_icon" 
     android:label="@string/my_second_launcher" 
     android:targetActivity=".MainScreen"> 
     <meta-data 
      android:name="secondLauncher" 
      android:value="true" /> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity-alias> 

Sau đó, trong hoạt động MainScreen, bạn có thể kiểm tra launcher bạn được gọi với, bạn có thể làm điều đó bằng cách tìm kiếm các phóng tên hoạt động-alias, hoặc bằng cách kiểm tra siêu dữ liệu tôi đã thêm ở trên:

ComponentName component = intent.getComponent(); 
String name = component.getShortClassName(); 
boolean secondLauncher = ".MySecondLauncher".equals(name); 

hoặc:

ActivityInfo info = getPackageManager().getActivityInfo(intent.getComponent(),PackageManager.GET_META_DATA); 
boolean secondLauncher = info.metaData.getBoolean("secondLauncher", false); 
Các vấn đề liên quan