私は、ViewPagerを利用するアプリケーションを作成しているので、ユーザーはフォームを記入し、スクロールして次のフラグメントに進みながら進捗を保存します。ViewPager最初の2つのフラグメントが順不同
まだ未完成です。しかし、私はAndroidからの奇妙な行動に遭遇します。
私は約9個の断片を持っており、HomeActivity
が呼び出されるとロードされます。最初はSiteDetailsFragment
、次はDevicePlacementDetailsFragment
などです。
私はonPageSelected
を無効にしてユーザーの現在の進行状況を保存し、フラグメント位置を使用して保存/検証する必要があるかどうかを判断します。私はList<Fragment> fs = getSupportFragmentManager().getFragments();
と呼んで、フラグメントの位置を保存しました。
しかし、私がアプリをテストしたとき、その2つは逆順でインスタンス化されているようです。DevicePlacementDetailsFragment
はfs
の最初のメンバーにあり、次にSiteDetailsFragment
が続きます。 DevicePlacementDetailsFragment
はfs
の位置0にあり、SiteDetailsFragment
は位置1にありますが、画面上で正しい順序になっています。
残りの断片は、右にスクロールすると順番に発声されます。
これは、フラグメントの位置と、onPageSelected
が呼び出されたときに何が行われる必要があるかを判断する必要があるため、私にとって混乱を招いています。
以下はコードです。私はそれが非常に奇妙であることを知っていますが、それは進行中の仕事です。私はこの問題の回避策としてコードを書きました。
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.Toast;
import com.xxx.psie_surveyandroid.R;
import com.xxx.psie_surveyandroid.adapters.ViewPagerAdapter;
import com.xxx.psie_surveyandroid.customlibs.CustomAppCompatActivity;
import com.xxx.psie_surveyandroid.fragments.CablingToIDUFragment_;
import com.xxx.psie_surveyandroid.fragments.CablingToTransmissionFragment_;
import com.xxx.psie_surveyandroid.fragments.DevicePlacementDetailFragment_;
import com.xxx.psie_surveyandroid.fragments.GroundFragment_;
import com.xxx.psie_surveyandroid.fragments.PhotoSiteSurveyFragment_;
import com.xxx.psie_surveyandroid.fragments.PowerDetailFragment_;
import com.xxx.psie_surveyandroid.fragments.RackAndRoomLayoutFragment_;
import com.xxx.psie_surveyandroid.fragments.SiteDetailFragment_;
import com.xxx.psie_surveyandroid.fragments.SpareFragment_;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import java.util.List;
/**
* @author Cipleyo
* @since 5/20/2016
*/
@EActivity(R.layout.home_activity_layout)
public class HomeActivity extends CustomAppCompatActivity {
public final static String TAG = HomeActivity.class.getSimpleName();
@ViewById Toolbar toolbar;
@ViewById TabLayout tabLayout;
@ViewById ViewPager vpForms;
private int lastPos = 0;
@AfterViews
void init(){
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
setupViewPager(vpForms);
tabLayout.setupWithViewPager(vpForms);
vpForms.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
List<Fragment> fs = getSupportFragmentManager().getFragments();
/*
These strange lines of codes are for fixing the misplaced first two Fragments.
Don't ask why - I have no idea.
*/
Fragment tempFragment = fs.get(0);
if (!(tempFragment instanceof SiteDetailFragment_)) {
fs.set(0, fs.get(1));
fs.set(1, tempFragment);
}
/* End of strange lines of codes */
Fragment f;
f = fs.get(lastPos);
if (lastPos > position) { //left
Log.i(TAG, "Scrolled Left, f = " + f);
} else { //right
Log.i(TAG, "Scrolled Right, f = " + f);
}
if (lastPos < position) { //swipe right
if (f instanceof SiteDetailFragment_) {
if (!((SiteDetailFragment_) f).executeSave()) {
vpForms.setCurrentItem(lastPos);
Toast.makeText(getApplicationContext(), "Please complete the required fields!",
Toast.LENGTH_SHORT).show();
} else
lastPos = position;
} else if (f instanceof DevicePlacementDetailFragment_){
if (!((DevicePlacementDetailFragment_) f).executeSave()){
vpForms.setCurrentItem(lastPos);
Toast.makeText(getApplicationContext(), "Please complete the required fields!",
Toast.LENGTH_SHORT).show();
} else
lastPos = position;
} else if (f instanceof RackAndRoomLayoutFragment_){
if (!((RackAndRoomLayoutFragment_) f).executeSave()){
vpForms.setCurrentItem(lastPos);
Toast.makeText(getApplicationContext(), "Please complete the required fields!",
Toast.LENGTH_SHORT).show();
} else
lastPos = position;
}
} else
lastPos = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void setupViewPager(ViewPager viewPager){
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new SiteDetailFragment_(), "Site Details");
adapter.addFragment(new DevicePlacementDetailFragment_(), "Device Placement Detail");
adapter.addFragment(new RackAndRoomLayoutFragment_(), "Rack And Room Layout");
adapter.addFragment(new PhotoSiteSurveyFragment_(), "Photo Site Survey");
adapter.addFragment(new PowerDetailFragment_(), "Power Details");
adapter.addFragment(new GroundFragment_(), "Ground");
adapter.addFragment(new CablingToTransmissionFragment_(), "Cabling To Transmission");
adapter.addFragment(new CablingToIDUFragment_(), "Cabling To IDU");
adapter.addFragment(new SpareFragment_(), "Spare");
viewPager.setAdapter(adapter);
}
}
私は私の問題を非常にうまく説明したいと思います。追加情報があればお気軽にお問い合わせください。ありがとう!
[FragmentManager.getFragments()隠され、私たちの使用のために意図されていない。](http://stackoverflow.com/questions/38772575/getsupportfragmentmanager-getfragments-deprecated) –