私のアプリケーションでは、ViewPagerを使用しました。お気に入り、
(say main.xml)
<Android.support.v4.view.ViewPager
Android:id="@+id/viewPager"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_above="@+id/register_header" />
そして、FragmentActivityにViewPagerオブジェクトとViewPagerAdapter(FragmentPagerAdapterを拡張する)オブジェクトを作成します。
_mViewPager = (ViewPager) findViewById(R.id.viewPager);
_adapter = new ViewPagerAdapter(getApplicationContext(),
getSupportFragmentManager());
_mViewPager.setAdapter(_adapter);
そして、Adapterクラスは次のようなものです。
public class ViewPagerAdapter extends FragmentPagerAdapter {
private Context _context;
private FragmentManager manager;
private Fragment f;
private String classname="ViewPagerAdapter";
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
_context=context;
manager=fm;
}
@Override
public Fragment getItem(int position) {
Log.i(classname,"getItem called"+position);
f = new Fragment();
f=MyFragment.newInstance();
Bundle args = new Bundle();
args.putInt("position", position);
f.setArguments(args);
return f;
}
@Override
public int getCount() {
return User.getPageCount();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
そして、MyFragmentクラスでは、
OnResumeでは、wigetsオブジェクトを共通の静的変数に格納する必要があります。
public void onResume() {
super.onResume();
pageIndex = getArguments().getInt("position");
User.useTextview1=textview1;
User.useTextview2= textview2;
User.current_pageIndex=pageIndex;
}
FragmentActivityのUserクラスから取得したテキストビューを更新する必要があります。 私の問題はgetItem()メソッドが最初に2回呼び出されることです事実上、エミュレーターに表示されるビューは0番目のインデックスですが、FragmentActivityで1番目のインデックス値を取得しました。 2回目にgetItem()メソッドの呼び出しを停止した場合、FragmentActivityで0番目のインデックスTextView参照を取得できます。
これを行うための最良の方法を教えてください。
ありがとう
FragmentPagerAdapter
は、開始時に2 Fragments
をインスタンス化し、インデックス0とインデックス1を表します。画面に表示されているFragment
からデータを取得する場合は、setOnPageChangeListener
にPager
を使用して現在の位置を取得できます。次に、フラグメントにSparseArray
とWeakReference
を付けます。 getItem
呼び出しでその配列を更新します。 onPageSelected
が呼び出されたら、その位置を使用して正しいFragment
への参照を取得し、User
データを更新します。
配列の初期化:
private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3);
getItemメソッドで私はこれを書きました。
@Override
public Fragment getItem(int index) {
EditFragment frag = new EditFragment();
Bundle args = new Bundle();
args.putSerializable("currentItem", itemsList.get(index));
frag.setArguments(args);
return (frag);
}
ここでitemsList.get(index)は、EditFragmentクラスで使用するモデルクラスオブジェクトです。これがそれです。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.pager_fragment_layout, container, false);
image = (ImageView)result.findViewById(R.id.pager_image);
text = (TextView)result.findViewById(R.id.pager_item_desc);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).build();
ImageLoader.getInstance().init(config);
imLoader = ImageLoader.getInstance();
****NOTE
final SwapItems itemList = (SwapItems) getArguments().getSerializable("currentItem");
imagePath = itemList.getPaths().get(0);
imLoader.displayImage(imagePath,image);
text.setText(itemList.getItemDescription());
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = new ItemImagesFragment();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putSerializable("val", itemList);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
return result;
}
注:ここでは、以前のgetItemメソッドからswapitemsモデルオブジェクトを取得していますが、「final」です。これで私の問題は解決します。以前のiは、修飾子としてstaticを使用して同じオブジェクトを初期化しました。
あなたもクリアすることを願っています
私は同じ問題に直面しました-getItem()メソッドが2回呼び出されました。私がその方法を使用する目的が、新しいスライドが表示されたときにホスティングアクティビティの変更をトリガーすることであったかどうかはわかりません。
まず第一に、getItem()は、新しいスライドが表示されるイベントを取得するための適切なメソッドではありません。
この目的のために、ViewPager自体でViewPager.OnPageChangeListenerリスナーを使用しました。これが私がしたことです:
スライドフラグメントを保持するアクティビティ内:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signature_wizard_activity);
// Instantiate a ViewPager and a PagerAdapter.
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
onSlideChanged(position); // change color of the dots
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
});
}
onPageScrolled()は、スライドが表示されるたびに呼び出され、パラメーターとして、表示されているスライドの現在の位置を取得します。スライドが変更されたときだけでなく、最初に表示されたときも含めて呼び出されるのは良いことです。
いつ使用できるか?たとえば、ViewPagerでいくつかのヒントを使用してフラグメントをスライドするウィザードアクティビティがある場合、スライダーの下に数字を表す灰色の点が付いたバーが必要になる可能性があります。スライドの合計数であり、ドットの1つは現在のスライドを表す異なる色になります。この場合、ViewPager.OnPageChangeListenerとメソッドonPageScrolled()が最適なオプションになります。
または、前のボタンがある場合。スライドを変更し、PREVを無効にするNEXT。最初のスライドのボタンをクリックし、最後のスライドの次へボタンを無効にします。 onPageScrolled()メソッド内でこれを行う方法は次のとおりです。
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position == 0){
prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
prevBtn.setEnabled(false);
}else{
prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
prevBtn.setEnabled(true);
}
if(position == NUM_PAGES -1){
nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
nextBtn.setEnabled(false);
}else{
nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
nextBtn.setEnabled(true);
}
}
ここで、NUM_PAGESは、スライドの総数を含む定数です。
私の問題は、getItem()メソッドが最初に2回呼び出されることです
これは問題ではありません。これはdefault feature of FragmentPagerAdapter
です。このページから次のページと前のページにスワイプするのは良いことです。
エミュレーターに表示されるビューは0番目のインデックスですが、FragmentActivityで1番目のインデックス値を取得しました
同じ問題が発生しましたが、その理由はわかっています。これはあなたがused same Fragment in View Pager
だからです。
これを修正する方法はseparate Fragments by using different Fragment
です。
このメソッドを使用して、ビューを更新できます
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Fetch data or something...
}
}