2012-04-10 2 views
1

Я знаю, что это может звучать как страшный вопрос, но я изучаю столько, сколько мог, чтобы понять это. У меня есть приложение, которое требует просмотра пейджера для прокрутки по горизонтали для отображения разных видов. В каждом представлении ему нужна функциональность, для одного вида это может быть просто нажатие кнопки, для загрузки данных с сервера требуется другое представление (например, получение последней ленты Twitter), а также другие функции. Главное, что в представлении Pager каждое представление требует функциональности.Создайте ViewPager или аналогичную функциональность в Android

Моя первоначальная идея состояла в том, чтобы следовать этот учебник:

http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/

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

Вот что я изначально имел:

public class DashboardContainerActivity extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    //Set content view to the dashboard container xml view 
    setContentView(R.layout.dashboard_container); 

    //Create a new instance of my page adapter from below 
    MyPageAdapter adapter = new MyPageAdapter(); 
    //Reference the view pager used in the dashboard container xml view 
    ViewPager myPager = (ViewPager) findViewById(R.id.dashboardpanelpager); 
    //set an adapter to the view pager 
    myPager.setAdapter(adapter); 
    //First panel to be shown when opened 
    myPager.setCurrentItem(3); 
    } 

} 

/*------------------------------------------------------*/ 
class MyPageAdapter extends PagerAdapter { 

    public int getCount() { 
     //Return 7 as there will be 7 panes in the dashboard 
     return 7; 
    } 

    public Object instantiateItem(View collection, int position) { 

     LayoutInflater inflater = (LayoutInflater) collection.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = null; 
     switch (position) { 
     case 0: 
      v = inflater.inflate(R.layout.dashboard_social, null); 
      break; 
     case 1: 
      v = inflater.inflate(R.layout.dashboard_info, null); 
      //DISPLAY INFORMATION FROM SERVER AND DISPLAY HERE 
      break; 
     case 2: 
      v = inflater.inflate(R.layout.dashboard_allcourses, null); 
      //LIST OF COURSES 

      break; 
     case 3: 
      v = inflater.inflate(R.layout.dashboard_news, null); 
      //USE HTTP HERE FOR TWITTER FEED 


      break; 
     case 4: 
      v = inflater.inflate(R.layout.dashboard_mycourse, null); 
      //DOWNLOAD USER'S PERSONAL INFORMATION AND DISPLAY HERE 

      break; 
     case 5: 
      v = inflater.inflate(R.layout.dashboard_media, null); 
      //DISPLAY LATEST UPLOADED MULTIMEDIA 
      break; 
     case 6: 
      v = inflater.inflate(R.layout.dashboard_extras, null); 
      break; 
     } 

     ((ViewPager) collection).addView(v, 0); 

     return v; 
    } 

    @Override 
    public void destroyItem(View arg0, int arg1, Object arg2) { 
     ((ViewPager) arg0).removeView((View) arg2); 

    } 

    @Override 
    public boolean isViewFromObject(View arg0, Object arg1) { 
     return arg0 == ((View) arg1); 

    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 
} 

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

Я прочитал кое-что о фрагментах, но я не уверен, совместим ли это с уровнем API 8, по-видимому, это предназначено для сотовых и мороженого сэндвич.

ответ

3

Невозможно иметь активность как часть ViewPager, однако нет причин, по которым вы не можете добавить функциональность, которую вы описываете, к каждой странице вашего ViewPager. Для назначения взаимодействия или событий для компонентов в каждом представлении просто добавить правильные слушатель в instantiateItem() в каждом случае заявлении:

case 0: 
     v = inflater.inflate(R.layout.dashboard_social, null); 
     Button myButton = (Button) v.findViewById(R.id.name_of_button_in_social_dashboard); 
     myButton.setOnClickListener(...); 
     break; 

Для любых других взаимодействий, как получать запросы HTTP для Твиттера, просто выполнить их как часть вашего основного вида деятельности (например, HTTP-запросы должны выполняться в фоновом потоке, конечно). Если вы хотите обновить пользовательский интерфейс на странице Twitter, просто используйте ViewPager.getChildAt(3) для извлечения дочернего элемента. Подумайте о своей деятельности как о простом макете с 7 детскими представлениями, которые доступны сразу (но пользователь будет видеть их только по мере их прокрутки).

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

Как ViewPager, фрагменты доступны вплоть до уровня API 4 через библиотеку поддержки (см. Fragment). Поэтому вам не нужно беспокоиться о обратной совместимости.

Смежные вопросы