ViewPager, вкладки прокрутки + Swiping

У меня есть вкладки, где есть некоторые Views такие как EditText, CheckBox, RadioButton и т.д. И используя ViewPager, я просматриваю эти вкладки.

Вот мой код:

activity_main.xml

<android.support.v4.view.viewpager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

 <!--
 This title strip will display the currently visible page title, as well as the page
 titles for adjacent pages.
 -->

 </android.support.v4.view.viewpager>

MainActivity.java

public class MainActivity extends FragmentActivity {

 /**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
 * will keep every loaded fragment in memory. If this becomes too memory
 * intensive, it may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */
 SectionsPagerAdapter mSectionsPagerAdapter;

 /**
 * The {@link ViewPager} that will host the section contents.
 */
 ViewPager mViewPager;

 private static DBManager dbManager;
 private static SharedPreferences myPrefs;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 dbManager = new DBManager();

 try {
 DBManager.init(getApplicationContext());
 } catch (SQLException e) {
 Log.e("SQLException: ", e.toString());
 }

 // Create the adapter that will return a fragment for each of the three
 // primary sections of the app.
 mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

 // Set up the ViewPager with the sections adapter.
 mViewPager = (ViewPager) findViewById(R.id.pager);
 mViewPager.setAdapter(mSectionsPagerAdapter);

 mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 @Override
 public void onPageScrolled(int i, float v, int i2) {

 }

 @Override
 public void onPageSelected(int i) {
 Log.i("Page", "" + i);
// Fragment frag = mSectionsPagerAdapter.getPrimaryItem();
// View v = frag.getView();
// if(v != null)
// Log.i("mda", "haaa");

 }

 @Override
 public void onPageScrollStateChanged(int i) {
 Log.i("mda", "hu");
 }
 });
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 ***************().inflate(R.menu.main, menu);
 return true;
 }


 /**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
 public class SectionsPagerAdapter extends FragmentPagerAdapter {
 private Fragment currentFragment;

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

 public Fragment getPrimaryItem(){
 return currentFragment;
 }


 @Override
 public Fragment getItem(int position) {
 // getItem is called to instantiate the fragment for the given page.
 // Return a DummySectionFragment (defined as a static inner class
 // below) with the page number as its lone argument.
 Fragment fragment = new DummySectionFragment();
 Bundle args = new Bundle();
 args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
 fragment.setArguments(args);
 return fragment;
 }

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

 @Override
 public CharSequence getPageTitle(int position) {
 Locale l = Locale.getDefault();
 switch (position) {
 case 0:
 return getString(R.string.title_section1).toUpperCase(l);
 case 1:
 return getString(R.string.title_section2).toUpperCase(l);
 case 2:
 return getString(R.string.title_section3).toUpperCase(l);
 case 3:
 return getString(R.string.title_section4).toUpperCase(l);
 case 4:
 return getString(R.string.title_section5).toUpperCase(l);
 }
 return null;
 }

 @Override
 public void setPrimaryItem(ViewGroup container, int position, Object object) {
 super.setPrimaryItem(container, position, object);
 currentFragment = (Fragment)object;
 }
 }

 /**
 * A dummy fragment representing a section of the app, but that simply
 * displays dummy text.
 */
 public static class DummySectionFragment extends Fragment {
 /**
 * The fragment argument representing the section number for this
 * fragment.
 */
 public static final String ARG_SECTION_NUMBER = "section_number";

 public DummySectionFragment() {
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
 View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
 TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
 dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));

 return rootView;
 }
 }
}

example_main_dummy.xml пример 1 вкладки xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" android:paddingbottom="@dimen/activity_vertical_margin" tools:context=".MainActivity$DummySectionFragment" android:orientation="vertical">

 <textview android:id="@+id/section_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:tag="Mda">

 <edittext android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/field1" android:tag="Muda" android:text="lalalala">

 <checkbox android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="New CheckBox" android:id="@+id/checkBox">

 <textview android:layout_width="wrap_content" android:layout_height="76dp" android:text="New Text" android:id="@+id/textView" android:layout_gravity="left|center_vertical" android:layout_marginleft="158dp">

 <radiobutton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New RadioButton" android:id="@+id/radioButton" android:layout_gravity="left|center_vertical">

 <radiobutton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New RadioButton" android:id="@+id/radioButton2" android:layout_gravity="left|center_vertical">

 </radiobutton></radiobutton></textview></checkbox></edittext></textview></linearlayout>

Проблема:

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

Я могу получить представление о текущем фрагменте страницы с помощью установки primaryItem, но я не могу получить представление о предыдущей вкладке. Как это можно сделать?

Заранее спасибо.

1 ответ

Мало что для вас,

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

Свойство, которое вы хотите попробовать:

setFreezesText() или андроид: freezesText для xml.

(примечание будет работать, только если TextView имеет идентификатор)

Это определяет, сохраняет ли это текстовое представление все содержимое текста при замораживании сосульки в дополнение к динамическому состоянию, такому как позиция курсора. По умолчанию это ложь, а не сохранение текста. Установите значение "Истина", если текст в текстовом представлении не сохраняется в другом месте в постоянном хранилище (например, в поставщике контента), так что, если вид позже будет разморожен, пользователь не потеряет свои данные.

Справочник по документам для Android: http://developer.android.com/reference/android/widget/TextView.html#setFreezesText%28boolean%29

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

Вы можете достичь этого, используя следующий метод вашего пейджера просмотра:

setOffScreenPageLimit (целое)

Справочник по документам для Android: http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

Теперь сохранение всех данных со всех вкладок можно сделать много раз, например, вы можете использовать пакет args Bundle в методе getItem для хранения данных первой вкладки и передачи ее на вторую вкладку.

@Override
 public Fragment getItem(int position) {

 Fragment fragment = new DummySectionFragment();
 Bundle args = new Bundle();
 args.putString("key",myTextView.getText().toString());
 args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
 fragment.setArguments(args);
 return fragment;
 }

Теперь новый экземпляр вашего фиктивного фрагмента будет иметь текст из этого TextView, хранящийся с ключевым ключом, и вы можете получить его с помощью метода getArguments() фрагмента.

Например:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

 //here is your arguments
 Bundle bundle=getArguments(); 

 //here is your list array 
 String myString=bundle.getString("key"); 
 }

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

Это может быть немного общим, но у него есть хорошие ссылки на общие привилегии.

http://developer.android.com/guide/topics/data/data-storage.html

Дайте мне знать, помогает ли этот ответ, или вам нужна дополнительная помощь.

EDIT:

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

Но пока, вот что вы можете сделать.

Метод onPageSelected (int position) - это то, где большая часть работы будет выполнена.

@Override
public void onPageSelected(int position) {
 //This makes sure we get the previous position in the view pager and also
 //makes sure we don't go to -1 when you swipe back to the 0th position.

 //The problem here is if you are using action bar tabs, the user can also select the third tab, from the first tab and the index will be pointing to the second tab. I did not go out of my way to handle this case. But with a few checks you can handle the cases.

 //Also without proper checks, swiping backwards will be an issue, so adding those cases may also be necessary.
 int index = position == 0 ? position : position - 1;


 View view = mViewPager.getChildAt(index);

 // View at this point is the previous view in your view pager
 // and you can access your textviews in the following way.

 TextView myTextView = (TextView) view.findViewById(R.id.section_label);


 // If using action bar tabs, set the selected tab.
 mActionBar.setSelectedNavigationItem(position);
}

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

Удачи

licensed under cc by-sa 3.0 with attribution.