8

Nó có thể là một câu hỏi khá mới nhưng dù sao đi nữa. Kể từ khi Tabhost được khấu hao tôi đã cố gắng để chuyển sang các tab thanh hành động nhưng tôi có vấn đề của tôi bằng cách sử dụng các mảnh vỡ. Có khả năng sử dụng các hoạt động trong các tab thanh tác vụ không?Action Bar Tabs mà không cần sử dụng Fragments?

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

Cảm ơn.

+0

Bạn thực sự cần phải sử dụng Phân đoạn. Các vấn đề của bạn khi sử dụng Fragments là gì? – nhaarman

+0

Vì tôi đã phát triển ứng dụng của mình bằng Tabhost, tôi gặp phải một số vấn đề nhất định "chuyển đổi" các tab của tôi thành một đoạn. Vấn đề chính của tôi trong số những người khác :) về cơ bản là không có ví dụ đơn giản về cách sử dụng Danh sách mở rộng và các phân đoạn. – Maddin

+1

Đăng câu hỏi về ExpandableList và các phân đoạn ... Tôi đặt cược bạn sẽ nhận được một số trợ giúp. :) – Barak

Trả lời

3

Nếu bạn đang thiết lập về việc sử dụng hoạt động trên mảnh vỡ bạn chỉ có thể sử dụng một ý định để khởi động hoạt động của bạn từ bạn ActionBar.TabListener

startActivity(new Intent(thisActivity(), thatActivity.class)); 

Bạn cũng nên kiểm tra nhận xét này về việc sử dụng Fragments over Activities

+4

Bắt đầu một hoạt động bằng cách nhấn vào thanh tác vụ sẽ là vô lý, vì làm như vậy sẽ loại bỏ tab và thanh tác vụ, thay thế bằng nội dung của hoạt động khác. – CommonsWare

+0

Đó là các lớp con đi vào, ý tưởng không phải là vô lý chút nào. – slinden77

+0

Thực ra đây chính là cách Google I/O 2014 được [triển khai] (https: // github.com/google/iosched/blob/chủ/android/src/chính/java/com/google/mẫu/ứng dụng/iosched/ui/BaseActivity.java # L802). Khi một mục trong ngăn điều hướng được nhấp vào một hoạt động mới được bắt đầu, thao tác này sẽ tạo lại ngăn điều hướng. Một lớp được gọi là 'BaseActivity' được sử dụng để triển khai ngăn điều hướng cho tất cả các lớp. – Benjamin

2

Có khả năng sử dụng các hoạt động trong các tab thanh tác vụ không?

May mắn thay, không.

Điều đó không có nghĩa là bạn phải sử dụng phân đoạn. TabListener của bạn có thể làm bất cứ điều gì nó muốn ảnh hưởng đến thay đổi trong giao diện người dùng của bạn. Một giải pháp brute-force sẽ được gọi lại là setContentView(), để đổ tất cả các vật dụng cũ của bạn và đặt xuống một bộ hoàn toàn mới (có lẽ khác).

+0

Cảm ơn câu trả lời của bạn. Đã thử nó với giải pháp mà MrEngineer gợi ý nhưng nó làm hài lòng những gì bạn nói. Tất nhiên bằng cách thay đổi View, hai cửa sổ của tôi được hiển thị nhưng rất nhiều điều khiển đã biến mất. Đoán để cung cấp cái nhìn và cảm nhận của TabHost mất giá bây giờ tôi sẽ phải sử dụng các mảnh vỡ. – Maddin

+0

câu trả lời này là sai, vì nó rất có thể thực sự – slinden77

+0

Tôi đã thử giải pháp này và nó có thể nhưng nó chắc chắn là một hack. Câu hỏi đặt ra là, vì đây không phải là cách tối ưu để tạo một tabview, nó ảnh hưởng đến hiệu suất hoạt động của ứng dụng đến mức nào? Tôi có nghĩa là nó xấu như vậy của một giải pháp mà nó có giá trị học tập làm thế nào để sử dụng các mảnh đúng và viết lại ứng dụng của tôi bằng cách sử dụng chúng? – Kalaji

0

Có thể sử dụng Activity với số ActionBar. Cẩn thận đây không phải là hành vi dự định mặc dù, nhưng điều đó không có nghĩa là nó không hoạt động hoàn hảo.

import android.annotation.SuppressLint; 
import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 

//@SuppressLint("NewApi") 
public class ActionBarActivity extends Activity { 

    private String TAG = getClass().getName(); 
    private Intent i = null; 
    private ActionBar actionBar; 
    private Tab one; 
    private Tab two; 
    private Tab three; 

    // create a tab listener that is called when the user changes tabs 
    ActionBar.TabListener tabListener = new ActionBar.TabListener() { 
     @Override 
     public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { 
      if (tab.getTag().equals("one")){ 
       Log.d(TAG, "tab one selected"); 
       i = new Intent(getApplicationContext(), One.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("two")){ 
       Log.d(TAG, "tab two selected"); 
       i = new Intent(getApplicationContext(), Two.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("three")){ 
       Log.d(TAG, "tab three selected"); 
       i = new Intent(getApplicationContext(), Three.class); 
       determineRun(); 
      }   
     } 

     @Override 
     public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub   
     } 

     @Override 
     public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub  
     } 
    }; 

    // we only need to start the Activity if it's not actually already the current Activity! 
    void determineRun(){ 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      startActivity(i); 
     } 
     return; 
    }//end method 

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

     actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setSubtitle(getResources().getString("subtitle"));   
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
     one = actionBar.newTab(); 
     one.setText("Tab 1").setTag("one"); 
     two = actionBar.newTab(); 
     two.setText("Tab 2").setTag("two"); 
     three = actionBar.newTab(); 
     three.setText("Tab 3").setTag("three");     
     one.setTabListener(tabListener); 
     two.setTabListener(tabListener); 
     three.setTabListener(tabListener); 

     // You will have to set the selected Tab manually 
     // A good idea would be to create a subclass for each Tab based on this code 
     // Then, just create a new Activity which extends ActionBarActivity 
     actionBar.addTab(one, 0, false); 
     actionBar.addTab(two, 1, true); // selected Tab 
     actionBar.addTab(three, 2, false); 
    }//end method 

    @Override 
    public void onResume(){ 
     super.onResume(); 

     Log.d(TAG, "onResume()"); 
     Log.d(TAG, ""+i.getComponent().getClassName()); 
     // again, here you need to select the Tab manually 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      actionBar.selectTab(two); // selected Tab 
     } 
    }//end method 

    @Override 
    public void onPause(){ 
     super.onPause(); 

     Log.d(TAG, "onPause()"); 
    }//end method 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 

     overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    }//end method  
}//end class 

Bạn có thể muốn ghi đè hoạt ảnh trong số Activity của mình để thay đổi các tab là không có vẻ. Để làm như vậy, thay đổi phương pháp onCreate() của Activity của bạn kéo dài ActionBarActivity

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

    overridePendingTransition(0, 0); 
}//end method 
+0

Đây không phải là các hoạt động trong các tab của thanh tác vụ. Đây là các hoạt động * được bắt đầu bằng tab thanh tác vụ * mà sau đó tiếp quản màn hình. Điều này không liên quan gì đến câu hỏi của OP. – CommonsWare

+0

nó có tác dụng tương tự, chúng ta không nitpick về một từ – slinden77

0

nếu hiểu biết của tôi là đúng, bạn muốn sử dụng thanh hành động để trao đổi hoạt động thay vì mảnh. trong trường hợp này, hãy tiếp tục đọc.

từ tài liệu chính thức mà bạn có thể thấy, tính năng thanh tác vụ xác định tập hợp ui, vị trí. nếu bạn muốn thực hiện thanh tác vụ với hoạt động, điều quan trọng nhất cần làm là 1. để liên kết tab (vị trí) với hoạt động của bạn. 2. thêm gọi lại tablistener (khởi tạo hoạt động mới của bạn, ngừng hoạt động hiện tại) mỗi khi tab được nhấp vào

thiết kế tốt nhất là yêu cầu trình duyệt tab thực hiện một lớp riêng biệt để mỗi hoạt động của bạn có thể sử dụng lớp này .

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