Как реализовать приложение с ViewPager (каждое представление содержит макет с некоторыми ключами)? - PullRequest
1 голос
/ 09 февраля 2012

Я хотел бы реализовать приложение, которое имеет три экрана.

Все три экрана будут иметь три разных макета с набором своих собственных клавиш.

Я хотел бы реализовать это внутри ViewPager, чтобы я мог проводить пальцами по своим экранам и взаимодействовать с каждым экраном, как будто я взаимодействую с действием.

Как я могу это сделать?

Один из моих коллег сказал мне, что мне нужно получить идентификатор всех используемых кнопок и представлений и должен взаимодействовать с ним отдельно. Я не понимаю этого. Может ли кто-нибудь объяснить мне логику реализации этого приложения.

Я хотел бы реализовать что-то вроде лаунчера в планшете или телефоне. Сенсорный слушатель сможет щелкнуть мышью на представлении или виджете, лежащем на экране ниже моей точки касания?

Пожалуйста, найдите цифры моего приложения.

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.

На всех экранах есть несколько кнопок и виджетов, которые должны реагировать на прикосновения / нажатия пользователя, когда каждый из них выделен.

Пожалуйста, пролите немного света на это.

Ответы [ 2 ]

2 голосов
/ 06 октября 2012

Мне удалось создать панель управления, похожую на пусковые установки некоторых устройств по умолчанию, реализовав 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, который я использую для отображения значков приложения.Я рассчитываю количество страниц (getCount ()) путем деления размера набора данных на количество элементов на странице (строки * столбцы).

Вы можете добавить onClickListener к vItem внутри цикла for на тот случай, если вы хотите обработать это событие.Я бы порекомендовал разделить слушателя между представлениями и запросить тег или идентификатор, прежде чем предпринимать какие-либо действия.

Если ваш контент статический, вы, вероятно, захотите использовать FragmentPagerAdapter и создать один фрагмент для каждой страницы..

0 голосов
/ 09 февраля 2012

Это довольно амбициозно - иначе каждый уже выпустил бы свое собственное приложение в стиле запуска - но выполнимо. Похоже, вам нужен ViewPager с GridView в качестве размещенного представления. GridView может легко делать то, о чем вы говорите, с прикрепленным к нему onItemClickListener(), чтобы фиксировать клики по каждому элементу. Существует множество учебных пособий для ViewPager (см. здесь для приличного) и GridView (см. здесь для приличного из тех ), теперь все, что вам нужно сделать, это заставить их работать вместе, что должно быть слишком сложно, учитывая небольшую работу.

...