2012-02-09 34 views
1

我想實現一個有三個屏幕的應用程序。如何使用ViewPager實現應用程序(每個視圖都包含一些帶有一些鍵的佈局)?

所有三個屏幕將擁有三個不同的佈局和一組自己的鍵。

我想在ViewPager中實現這個功能,這樣我就可以滑動屏幕,並與每個屏幕交互,就好像我正在與一個活動交互一樣。

我該怎麼做?

我的一位同事告訴我,我需要獲取所有使用的按鈕和視圖的ID,並且應該分別與其交互。我明白這一點。有人可以向我解釋執行這個應用程序的邏輯嗎?

我想在平板電腦或手機中實現類似啓動器的功能。觸摸監聽器是否能夠點擊屏幕下方的視圖或小部件?

請找到我的應用程序的數字。

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.

所有畫面有一些按鈕和小部件這就需要用戶觸摸響應/每個被高亮顯示時單擊。

請說明這一點。

回答

0

這是相當雄心勃勃的 - 否則每個人都會發布自己的啓動器式應用程序 - 但是可行。聽起來像你需要一個ViewPagerGridView作爲託管視圖。 GridView可以輕鬆地通過附加的onItemClickListener()來完成您正在討論的內容,以捕獲每個項目的點擊次數。對於ViewPager(請參閱here爲一個體面的一個)和GridView(請參閱here爲一個體面的那些)有很多教程,現在您所需要做的就是讓它們一起工作,這應該太難了一點工作。

2

通過實現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循環內添加onClickListener到vItem。我建議在採取任何行動之前分享視圖之間的監聽者並要求標籤或ID。

如果您的內容是靜態的,您可能需要改爲使用FragmentPagerAdapter,併爲每個頁面創建一個Fragment。

相關問題