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();
}
});