我目前正在使用适用于 Android >= 4.0 的应用程序的片段进行选项卡式布局。选项卡不在操作栏中。我不需要每个标签都有新的活动。我总是显示相同数量和相同类型的数据。
由于我的目的没有“最佳实践”指南(我认为?!)我在这里发布我的代码(这是有效的)。我希望你能找到一些我可以做一些(性能)改进的段落,以及我做了一些不是“最佳实践”的事情(例如架构)。我已经想到了我在片段类中使用 Gridview 的段落。
应该显示选项卡式布局的活动
public class LevelActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_level);
}
}
上述活动的 xml 文件
<fragment
class="com.test.puzzle.tabs.TabsFragment"
android:id="@+id/tabs_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
我的片段类:
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>
我的片段数据适配器类
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>