2016-01-25 2 views
0

Я начинающий разработчик Android (я разработчик Windows с 1995 года), и я разрабатываю свое первое приложение. У меня есть двумерный массив данных (что-то вроде [2] []). В основном он представляет собой три разных набора данных, которые должны быть представлены на экране устройства. К сожалению, хотя два из них могут быть представлены с использованием сетки, третий набор должен быть представлен совершенно другим способом. Так что мне нужна трехстраничная деятельность; в первых двух я хотел бы использовать общий макет, заполненный необходимыми данными, а на третьей странице я должен использовать совершенно другой макет.Android: несколько страниц с одной активностью

Я нашел это: ViewPager Without Fragments, но, к сожалению, я смущен тем, где разместить код для обработки ввода пользователя на трех страницах.

Будучи новичком на Android, я на самом деле немного смущен тем, что должно быть общим подходом в такой ситуации. В моем обычном опыте разработки я бы создал окно с элементом управления с вкладками, тремя вкладками, сетками в первых двух и некоторым настраиваемым элементом управления в третьем. Эти три элемента управления будут жить в одной и той же области видимости (мое окно) и будут заполнены во время загрузки окна.

Я понимаю, что в Android я должен придерживаться совершенно другого подхода, но, как я уже сказал, я смущен: фрагменты? Нет фрагментов? Что еще?

Спасибо!

+0

Я бы сказал: Фрагменты. Таким образом, вы можете поменять их по мере необходимости, оставаясь в одной и той же Деятельности. –

ответ

1

Чтобы реализовать несколько страниц в рамках одного действия, вам необходимо использовать фрагменты. В вашем случае нам понадобится 3 фрагмента. Файл макета активности должен содержать ViewPager, в котором будут храниться фрагменты в активности. Вы также можете добавить TabLayout, если вы хотите, чтобы фрагменты также были доступны через вкладки. образца макет активности может быть следующим:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="your.package.name.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:contentInsetLeft="0dp" 
      app:contentInsetStart="0dp" 
      app:popupTheme="@style/AppTheme.PopupOverlay" 
      app:titleTextColor="@color/colorAccent" 
      /> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="fill" 
      android:background="@color/grey" 
      app:tabGravity="fill" 
      app:tabIndicatorColor="@color/colorAccent" 
      app:tabIndicatorHeight="5dp" 
      app:tabSelectedTextColor="@color/colorAccent" 
      app:tabTextColor="@color/black"/> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 


</android.support.design.widget.CoordinatorLayout> 

После этого, вам нужно создать FragmentPagerAdapter класса в своем классе активности. Этот адаптер будет управлять созданием вашего ViewPager, который содержит фрагменты в Activity. Вот пример FragmentPagerAdapter SubClass

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 

      Log.d(LOG_TAG, "postion " + position); 
      if (position == 0) { 
       return Fragment1.newInstance(position + 1); 
      } else if (position == 1) { 
       return Fragment2.newInstance(position + 1); 
      } else { 
       return Fragment3.newInstance(position + 1); 
      } 

     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
       case 0: 
        return "Fragment1"; 
       case 1: 
        return "Fragment2"; 
       case 2: 
        return "Fragment3"; 


      } 
      return null; 
     } 

    } 

Это сделано, теперь вы можете получить ссылку на ViewPager в деятельности OnCreate метод и установить адаптер ViewPager следующим

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
viewPager.setAdapter(mSectionsPagerAdapter); 

// setting the views to be accessed through tabs 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       int currentTab = tab.getPosition(); 
       viewPager.setCurrentItem(currentTab); 

      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 


} 

Надежда это ясно для вас. Для получения дополнительной информации вы также можете проверить here

+0

Спасибо за этот исчерпывающий ответ! Я также нашел эти очень интересные статьи в блоге: [Android: вкладки. Фрагментный путь] (https://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/) - [Android: просмотр страницы с помощью ViewPager] (https: //thepseudocoder.wordpress. com/2011/10/05/android-page-swiping-using-viewpager /) и [Android: вкладки + ViewPager (вкладки, доступные для прокрутки, FTW)] (https://thepseudocoder.wordpress.com/2011/10/ 13/андроид-вкладка-ViewPager-салфетка-способная-вкладка-FTW /). [ – Disti

1

Вы можете обрабатывать ввод пользователя в пределах своей деятельности, или вы можете разбить его на Фрагменты. Оба описаны ниже.

активность

Проблема, как правило, вы получите ссылки на Views в макете во время onCreate() методы Activity и выполнить любую установку (добавление OnClickListener с, и т.д.), но это не представляется возможным в данном случае, потому что в в этот момент ваш ViewPager не загрузил ни одной страницы, и представления на этих страницах еще не находятся в иерархии представлений. (Система просмотра и компоновки Android может быть довольно запутанной, если задействованы ViewPager s).

Вместо этого вам нужно будет получить ссылки и выполнить настройку внутри instantiateItem() вашего адаптера и предположительно аннулировать эти ссылки в destroyItem().

Фрагменты

Проблема, описанная выше, вероятно, причина Фрагменты поддерживаются непосредственно в рамках (с использованием FragmentPagerAdapter или FragmentStatePagerAdapter). С помощью Fragment для каждой страницы вы можете получить ссылки на представления на этой странице и выполнить настройку внутри onCreateView() (или onViewCreated()), а бизнес-логику также можно инкапсулировать в фрагмент. В принципе, вам не нужно беспокоиться о существовании представлений относительно сроков этих обратных вызовов, в отличие от onCreate().

Другим преимуществом является то, что, обладая логикой, заключенной в отдельные фрагменты, у вас есть степень модульности с вашим приложением. Если вы можете представить свое приложение на большом экране, имеющем, возможно, две (или даже все три) ваших «страниц», видимых сразу, то, вероятно, лучше использовать Фрагменты с самого начала.

+0

Спасибо Каракури! – Disti

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