android - 如何用 ViewPager 实现一个应用程序(每个 View 都有一个带有一些键的布局)?

标签 android android-viewpager

我想实现一个具有三个屏幕的应用程序。

所有三个屏幕都将具有三种不同的布局和一组自己的键。

我想在 ViewPager 中实现它,这样我就可以滑动我的屏幕,并与每个屏幕进行交互,就好像我正在与一个 Activity 进行交互一样。

我该怎么做?

我的一位同事告诉我,我需要获取所有使用的按钮和 View 的 ID,并且应该分别与之交互。我不明白。有人可以向我解释实现此应用程序的逻辑吗?

我想在平板电脑或手机中实现类似启动器的功能。触摸监听器是否能够点击我触摸点下方屏幕上的 View 或小部件?

请找到我的应用程序的数字。

Figure-1. Default View of the Application with one screen highlighted in the Screen. The side screens just give an idea that there are screens to the sides.

Figure-2. When the screen was swiped to the Right.

Figure-3. When the screen was swiped to the Left.

所有屏幕都有一些按钮和小部件,当每个按钮和小部件突出显示时需要响应用户触摸/单击。

请阐明这一点。

最佳答案

我通过实现 ViewPager 和创建我自己的 PagerAdpter 设法创建了一个仪表板,类似于某些设备的默认启动器。请看下面的代码:

public class DashboardPagerAdapter extends PagerAdapter {

private static final int ROWS = 4;
private static final int COLS = 4;

private Context mContext;
private List<AppEntry> mData;

public DashboardPagerAdapter(Context context, List<AppEntry> data) {
    mContext = context;
    mData = data;
}

@Override
public int getCount() {
    double ratio = (double) mData.size() / (ROWS * COLS);
    return (int) Math.ceil(ratio);
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((TableLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

    int cols = COLS, rows = ROWS;
    switch (mContext.getResources().getConfiguration().orientation) {
    case Configuration.ORIENTATION_PORTRAIT:
        rows++;
        break;
    default:
        cols++;
    }

    TableLayout table = new TableLayout(mContext);
    table.setStretchAllColumns(true);
    table.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT));
    table.setBackgroundColor(Color.DKGRAY);

    int start = position * rows * cols;
    int end = Math.min(start + rows * cols, mData.size());

    LayoutInflater inflater = LayoutInflater.from(mContext);

    for (int i = 0; i < rows; i++) {
        TableRow row = new TableRow(mContext);
        row.setLayoutParams(new TableLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
        row.setGravity(Gravity.CENTER);
        for (int j = 0; j < cols; j++) {

            int pos = start + i * cols + j;

            if (pos < end) {

                AppEntry item = mData.get(pos);

                View vItem = inflater.inflate(R.layout.grid_item, null,
                        false);

                ImageView image = (ImageView) vItem.findViewById(R.id.icon);
                image.setImageDrawable(item.getIcon());

                row.addView(vItem);
            } else {
                TextView vPlaceHolder = new TextView(mContext);
                vPlaceHolder.setText(" ");
                row.addView(vPlaceHolder);
            }

        }
        table.addView(row);
    }

    container.addView(table);

    return table;

}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
}

在这种情况下,instantiateItem 方法返回一个 TableLayout,我用它来显示应用程序图标。我通过将数据集合的大小除以每页的项目数 (rows * cols) 来计算页数 (getCount())。

如果您想处理该事件,您可以在 for 循环内向 vItem 添加一个 onClickListener。我建议在 View 之间共享监听器,并在采取任何操作之前询问标签或 ID。

如果您的内容是静态的,您可能希望改用 FragmentPagerAdapter,并为每个页面创建一个 fragment 。

关于android - 如何用 ViewPager 实现一个应用程序(每个 View 都有一个带有一些键的布局)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9212661/

相关文章:

Android - fragment 屏幕旋转

java - FragmentStatePagerAdapter 不处理更改

android - 将 Wharton 的 ViewPagerIndicator 添加到 Action Bar 布局

android - 以编程方式更改导航选项卡的颜色

android - 动态更改 Listview 的高度 Android

java - 如何在警报对话框中强制输入单行?

android - 如何使用 Clang 和最新的 NDK r15b 为 Android 构建 OpenCV

android - 应用 PageTransformer 时,ViewPager 中的 ListView 不会滚动

android - 如何动态更改 ViewPager 中的 fragment ?

android - 在 "end of translate animation"和布局重新定位之间,有一个意外的 "jump"。如何避免?