Fragment の中の onCreateView で表示する為に、ボタンをクリックした時に TextView にセットすると同時に Fragment の中に定義した static な変数にも保存しました。保存された値は、adapter から getItem で呼ばれた時に渡す新たなインスタンスを作成する時に、再度 putStringArray でセットし setArguments でフラグメントに保存されます。 このような処理をインターネットで探しても無かったので、こうしてみましたが一応は動いています。このベースは、Android Studio のテンプレートなので、getArguments().getInt(PAGE_POSTION) をいきなり使うのは問題無いと思います( テンプレートでそうなっていたので )。なので、その付加情報として配列を追加した形です。MainActivity.java
import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private SectionsPagerAdapter adapter; private ViewPager view_pager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new SectionsPagerAdapter(getSupportFragmentManager()); view_pager = (ViewPager) findViewById(R.id.viewPager); view_pager.setOffscreenPageLimit(1); view_pager.setAdapter(adapter); } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return PlaceholderFragment.newInstance(position); } @Override public int getCount() { return 4; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "SECTION 1"; case 1: return "SECTION 2"; case 2: return "SECTION 3"; case 3: return "SECTION 4"; } return null; } } public static class PlaceholderFragment extends Fragment { private static final String PAGE_POSTION = "page_position"; private static final String SAVE_VIEW_TEXT = "save_view_text"; private static String text[] = new String[4]; public PlaceholderFragment() { } public static PlaceholderFragment newInstance(int pagePosition) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(PAGE_POSTION, pagePosition); args.putStringArray("save_view_text", text); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_main, container, false); if (getArguments().getStringArray(SAVE_VIEW_TEXT)[getArguments().getInt(PAGE_POSTION)] != null) { TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setText(getArguments().getStringArray(SAVE_VIEW_TEXT)[getArguments().getInt(PAGE_POSTION)]); } Button btn = (Button) rootView.findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText et = (EditText) rootView.findViewById(R.id.editText); TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setText(et.getText().toString()); text[getArguments().getInt(PAGE_POSTION)] = et.getText().toString(); } }); return rootView; } } }
setOffscreenPageLimit(1) を 3 にすれば、アクティビティが破棄されない場合は TextView の値を保持してくれます。ですが、メモリを無駄に使うと思うので、Fragment の setArguments で渡すほうがいいと思います。 activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="lightbox.july.viewpagerapplication.MainActivity"> <android.support.v4.view.ViewPager android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/viewPager" android:layout_alignParentTop="true" android:layout_alignParentStart="true"> <android.support.v4.view.PagerTitleStrip android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/view"/> </android.support.v4.view.ViewPager> </RelativeLayout>
PagerTitleStrip は、特別必要ではありませんが、ViewPager のタイトルをせっかく処理しているので使用しています。設置は、手作業で ViewPager の間に挟む必要がありました。カスタムビューなので、コンポーネントツリーではうまくいきませんでした。 fragment_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/section_label" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="40dp" android:layout_marginBottom="10dp"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/section_label" android:layout_alignParentStart="true"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" android:layout_below="@+id/editText" android:layout_alignParentStart="true"/> </RelativeLayout>
結局これを使えば、わりと簡単に横スクロールのページ処理ができますが、Android の テンプレートでは、FloatingActionButton が使用されていたので、それを使うとページ先頭とページ最後へのジャンプも簡単に実装できます。 ※ FloatingActionButton は、com.android.support:design を追加する必要があります Snackbar によるイベント処理
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "ページ移動", Snackbar.LENGTH_LONG) .setAction("先頭", new View.OnClickListener() { @Override public void onClick(View v) { mViewPager.setCurrentItem(0); } }) .show(); } }); FloatingActionButton fab2 = (FloatingActionButton) findViewById(R.id.fab2); fab2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "ページ移動", Snackbar.LENGTH_LONG) .setAction("最後", new View.OnClickListener() { @Override public void onClick(View v) { mViewPager.setCurrentItem(3); } }) .show(); } });
|
【Android Studio 2の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android Studio で、ListView アプリケーションを作成するテンプレート
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : DialogFragment 内の ListView を ArrayAdapter でカスタムする
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- javamail-android + AsyncTask でメール送信を行う為のテンプレート
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio
- Android Studio が 2.0 になりました。前からの内容も含めて整理してます。