2012-02-26 36 views
11

tôi đã thử này http://developer.android.com/guide/tutorials/views/hello-tabwidget.html nhưng nó sử dụng tabactivity không được chấp nhận, và eclipse đề nghị tôi sử dụng fragmentactivity thay vào đó, và nó mang lại cho tôi một mẫu (trên tooltip), nhưng tôi nghĩ rằng mẫu nó đã cho tôi thực sự Tôi chỉ muốn một tab đơn giản như url ở trên trò chơi .. bất kỳ mẫu về cách sử dụng fragmentactivity để đạt được các tab chính xác giống như url (cách nhấn vào nút trên các tab không thay đổi hoạt động, thay vào đó nó chỉ thay đổi nội dung đang được hiển thị)?tab đơn giản sử dụng fragmentactivity thay vì tabactivity

chỉ để tham khảo, đây là mẫu mà nhật thực được đề xuất cho tôi (thông qua chú giải công cụ mở rộng): to lớn, phải không?

@Deprecated Lớp học này không còn được dùng nữa. Các ứng dụng mới nên sử dụng Fragments thay vì lớp này; để tiếp tục chạy trên các thiết bị cũ hơn, bạn có thể sử dụng thư viện hỗ trợ v4 cung cấp phiên bản API phân đoạn tương thích với DONUT.

Đối với các ứng dụng phát triển chống lại HONEYCOMB trở lên, các tab thường là được trình bày trong giao diện người dùng bằng ActionBar.newTab() và API có liên quan để đặt các tab trong khu vực thanh tác vụ của chúng.

Thay thế cho TabActivity cũng có thể được thực hiện bằng cách trực tiếp bằng cách sử dụng TabHost. Bạn sẽ cần phải xác định bố cục sử dụng đúng cách một Tabcode với TabWidget cũng như khu vực để hiển thị nội dung tab của bạn.

Một ví dụ điển hình sẽ là:

<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@+android:id/realtabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"/> 

    </LinearLayout> 
</TabHost> 

Việc thực hiện nhu cầu để tiếp nhận trách nhiệm để chuyển đổi nội dung hiển thị khi thiết bị chuyển mạch sử dụng giữa các tab.

import java.util.HashMap; 
import com.example.android.supportv4.R; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 
import android.view.View; 
import android.widget.TabHost; 

/** 
* This demonstrates how you can implement switching between the tabs of a 
* TabHost through fragments. It uses a trick (see the code below) to allow 
* the tabs to switch between fragments instead of simple views. 
*/ 
public class FragmentTabs extends FragmentActivity { 
    TabHost mTabHost; 
    TabManager mTabManager; 

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

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(); 

     mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent); 

     mTabManager.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"), 
       FragmentStackSupport.CountingFragment.class, null); 
     mTabManager.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"), 
       LoaderCursorSupport.CursorLoaderListFragment.class, null); 
     mTabManager.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"), 
       LoaderCustomSupport.AppListFragment.class, null); 
     mTabManager.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"), 
       LoaderThrottleSupport.ThrottledLoaderListFragment.class, null); 

     if (savedInstanceState != null) { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("tab", mTabHost.getCurrentTabTag()); 
    } 

    /** 
    * This is a helper class that implements a generic mechanism for 
    * associating fragments with the tabs in a tab host. It relies on a 
    * trick. Normally a tab host has a simple API for supplying a View or 
    * Intent that each tab will show. This is not sufficient for switching 
    * between fragments. So instead we make the content part of the tab host 
    * 0dp high (it is not shown) and the TabManager supplies its own dummy 
    * view to show as the tab content. It listens to changes in tabs, and takes 
    * care of switch to the correct fragment shown in a separate content area 
    * whenever the selected tab changes. 
    */ 
    public static class TabManager implements TabHost.OnTabChangeListener { 
     private final FragmentActivity mActivity; 
     private final TabHost mTabHost; 
     private final int mContainerId; 
     private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>(); 
     TabInfo mLastTab; 

     static final class TabInfo { 
      private final String tag; 
      private final Class<?> clss; 
      private final Bundle args; 
      private Fragment fragment; 

      TabInfo(String _tag, Class<?> _class, Bundle _args) { 
       tag = _tag; 
       clss = _class; 
       args = _args; 
      } 
     } 

     static class DummyTabFactory implements TabHost.TabContentFactory { 
      private final Context mContext; 

      public DummyTabFactory(Context context) { 
       mContext = context; 
      } 

      @Override 
      public View createTabContent(String tag) { 
       View v = new View(mContext); 
       v.setMinimumWidth(0); 
       v.setMinimumHeight(0); 
       return v; 
      } 
     } 

     public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) { 
      mActivity = activity; 
      mTabHost = tabHost; 
      mContainerId = containerId; 
      mTabHost.setOnTabChangedListener(this); 
     } 

     public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { 
      tabSpec.setContent(new DummyTabFactory(mActivity)); 
      String tag = tabSpec.getTag(); 

      TabInfo info = new TabInfo(tag, clss, args); 

      // Check to see if we already have a fragment for this tab, probably 
      // from a previously saved state. If so, deactivate it, because our 
      // initial state is that a tab isn't shown. 
      info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); 
      if (info.fragment != null && !info.fragment.isDetached()) { 
       FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 
       ft.detach(info.fragment); 
       ft.commit(); 
      } 

      mTabs.put(tag, info); 
      mTabHost.addTab(tabSpec); 
     } 

     @Override 
     public void onTabChanged(String tabId) { 
      TabInfo newTab = mTabs.get(tabId); 
      if (mLastTab != newTab) { 
       FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 
       if (mLastTab != null) { 
        if (mLastTab.fragment != null) { 
         ft.detach(mLastTab.fragment); 
        } 
       } 
       if (newTab != null) { 
        if (newTab.fragment == null) { 
         newTab.fragment = Fragment.instantiate(mActivity, 
           newTab.clss.getName(), newTab.args); 
         ft.add(mContainerId, newTab.fragment, newTab.tag); 
        } else { 
         ft.attach(newTab.fragment); 
        } 
       } 

       mLastTab = newTab; 
       ft.commit(); 
       mActivity.getSupportFragmentManager().executePendingTransactions(); 
      } 
     } 
    } 
} 
+1

đây là những gì tôi nghĩ mình cần .. https://gist.github.com/1126843 nhưng làm cách nào để đặt nội dung của các tab? – imin

+0

Liên quan: http://stackoverflow.com/questions/7599816/tabactivity-is-deprecated – Casebash

Trả lời

7

Tôi nghĩ rằng những gì bạn cần là thế này:

http://developer.android.com/guide/topics/fundamentals/fragments.html

Và đây là một hoạt động mảnh tab dụ:

http://android.codeandmagic.org/2011/07/android-tabs-with-fragments/

Nó bao gồm tất cả những điều cơ bản trong mảnh cho android. Chúc may mắn!

+0

Thưa bạn, liên kết thứ hai bị hỏng, bạn có phiền khi cập nhật nó không? Cảm ơn –

+0

Liên kết thứ hai hoạt động tốt ngay bây giờ – Abx

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