1

我目前正在使用适用于 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>
4

2 回答 2

2

我回答了一个可能对您有所帮助的相关问题,因为它详细说明了如何使用片段制作标签。我的建议是为每个选项卡使用单独的片段(我认为这会使一切变得更容易),但根据您的实现,您可能想要追求另一个方向。

于 2013-06-21T14:45:08.417 回答
1

我注意到的一件事是你应该这样做:

mRoot = inflater.inflate(R.layout.tabs_fragment, container, false);

而不是这个

mRoot = inflater.inflate(R.layout.tabs_fragment, null);

看看这个链接:

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

于 2013-06-21T09:33:53.937 回答