2013-06-21 21 views
1

我目前正在使用针对Android> = 4.0的应用程序使用片段的选项卡式布局。这些标签不在操作栏中。我不需要为每个标签添加新的活动。我总是显示相同数量和相同类型的数据。因为我的目的没有“最佳实践”指南(我认为?!)我在这里发布我的代码(这是工作)。我希望你找到一些我可以做一些(性能)改进的地方,以及我做了什么不是“最佳实践”(例如架构)的地方。我已经考虑过在片段类中使用Gridview的地方。将分段视图用于Android> = 4.0(无操作栏)

应显示选项卡式布局的活动

public class LevelActivity extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_level); 
} 
} 

为上述活动

<fragment 
     class="com.test.puzzle.tabs.TabsFragment" 
     android:id="@+id/tabs_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

我的片段类的xml文件:

public class TabsFragment extends Fragment implements OnTabChangeListener { 

public static final String TAB_1 = "Pack 1"; 
public static final String TAB_2 = "Pack 2"; 

private View mRoot; 
private TabHost mTabHost; 
private int mCurrentTab; 

private TabFragmentAdapter mAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    mRoot = inflater.inflate(R.layout.tabs_fragment, container, false); 
    mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost); 
    setupTabs(); 
    return mRoot; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setRetainInstance(true); 

    mTabHost.setOnTabChangedListener(this); 
    mTabHost.setCurrentTab(mCurrentTab); 

    updateTab(R.id.tab_1); 
} 

private void setupTabs() { 
    mTabHost.setup(); // you must call this before adding your tabs! 
    mTabHost.addTab(newTab(TAB_1, R.id.tab_1)); 
    mTabHost.addTab(newTab(TAB_2, R.id.tab_2)); 
} 

private TabSpec newTab(String tag, int tabContentId) { 
    TabSpec spec = mTabHost.newTabSpec(tag); 
    spec.setContent(tabContentId); 
    spec.setIndicator(tag); 
    return spec; 
} 

@Override 
public void onTabChanged(String tabId) { 
    if (TAB_1.equals(tabId)) { 
     updateTab(R.id.tab_1); 
     mCurrentTab = 0; 
    } 
    if (TAB_2.equals(tabId)) { 
     updateTab(R.id.tab_2); 
     mCurrentTab = 1; 
    } 
} 


private void updateTab(int viewId) { 
    final GridView grid = (GridView) mRoot.findViewById(viewId); 
    if (mAdapter == null) { 
     mAdapter = new TabFragmentAdapter(mRoot.getContext(), mTabHost.getCurrentTabTag()); 
    } 
    grid.setAdapter(mAdapter); 
} 
} 

我的XML布局文件片段:

<?xml version="1.0" encoding="utf-8"?> 
<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:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 

    <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

     <GridView 
       android:id="@+id/tab_1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:numColumns="2" 
       android:verticalSpacing="20dp" 
       android:horizontalSpacing="20dp"> 
     </GridView> 

     <GridView 
       android:id="@+id/tab_2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:numColumns="2" 
       android:verticalSpacing="20dp" 
       android:horizontalSpacing="20dp"> 
     </GridView> 

    </FrameLayout> 
</LinearLayout> 
</TabHost> 

因为我已经注意到了fragements数据

public class TabFragmentAdapter extends BaseAdapter { 

private Context mContext; 
private String mPackString; 

private final String[] WORDS = {"test3", "test6", "test4", "test4", 
     "test1", "test2", "test7", "test3", "test9", "test6", 
     "test3", "test7"}; 

public TabFragmentAdapter(Context context, String packString) { 

    mContext = context; 
    mPackString = packString; 

} 

@Override 
public int getCount() { 
    return WORDS.length; 
} 

@Override 
public Object getItem(int i) { 
    return WORDS[i]; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder viewHolder; 

    if (view == null) { // if it's not recycled, initialize some attributes 
     final LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.list_item, parent, false); 
     viewHolder = new ViewHolder(view); 
     view.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 

    viewHolder.getTextView().setText(WORDS[position]); 

    return view; 
} 

private class ViewHolder { 
    private final View mRoot; 
    private TextView mText; 

    public ViewHolder(View root) { 
     mRoot = root; 
    } 

    public TextView getTextView() { 
     if (mText == null) { 
      mText = (TextView) mRoot.findViewById(R.id.text); 
     } 
     return mText; 
    } 
} 

} 

我的列表项XML

<?xml version="1.0" encoding="utf-8"?> 


<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

     ></TextView> 

回答

2

我回答了related question,可以帮助你,因为它详细介绍如何使片段标签。我的建议是为每个选项卡使用单独的片段(我认为它使一切变得更加容易),但取决于您的实现,您可能想要追求另一个方向。

+0

如果我不想使用支持库,我认为我不能使用您的方法 – user993441