2016-08-27 4 views
0

私は、ViewPagerを利用するアプリケーションを作成しているので、ユーザーはフォームを記入し、スクロールして次のフラグメントに進みながら進捗を保存します。ViewPager最初の2つのフラグメントが順不同

まだ未完成です。しかし、私はAndroidからの奇妙な行動に遭遇します。

私は約9個の断片を持っており、HomeActivityが呼び出されるとロードされます。最初はSiteDetailsFragment、次はDevicePlacementDetailsFragmentなどです。

私はonPageSelectedを無効にしてユーザーの現在の進行状況を保存し、フラグメント位置を使用して保存/検証する必要があるかどうかを判断します。私はList<Fragment> fs = getSupportFragmentManager().getFragments();と呼んで、フラグメントの位置を保存しました。

しかし、私がアプリをテストしたとき、その2つは逆順でインスタンス化されているようです。DevicePlacementDetailsFragmentfsの最初のメンバーにあり、次にSiteDetailsFragmentが続きます。 DevicePlacementDetailsFragmentfsの位置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); 
    } 
} 

私は私の問題を非常にうまく説明したいと思います。追加情報があればお気軽にお問い合わせください。ありがとう!

+0

[FragmentManager.getFragments()隠され、私たちの使用のために意図されていない。](http://stackoverflow.com/questions/38772575/getsupportfragmentmanager-getfragments-deprecated) –

答えて

0

私はここで、より良い回避策が見つかりました:。@コード-見習いが、指摘getSupportFragmentAdapter()のよう Is there a way to get references for all currently active fragments in an Activity?

をgetFragments()私は期待のように動作されていません。だから私は別のルートを使用してActivity.onAttachFragment()

注:私はサポートライブラリの断片を使用しています。ネイティブフラグメントを使用している場合は、onAttachFragmentメソッドをオーバーライドする必要があります。私が見

protected List<WeakReference<Fragment>> fragmentList = new ArrayList<>(); 

public void onAttachFragment(Fragment fragment){ 
    fragmentList.add(new WeakReference<>(fragment)); 
} 

public List<Fragment> getActiveFragments(){ 
    ArrayList<Fragment> ret = new ArrayList<>(); 
    for (WeakReference<Fragment> ref : fragmentList){ 
     Fragment f = ref.get(); 
     if (f != null){ 
      if (f.isVisible()){ 
       ret.add(f); 
      } 
     } 
    } 
    return ret; 
} 
1

getSupportFragmentManager().getFragments() deprecated?によると、FragmentManager.getFragments()はAndroid APIの古いバージョンでは表示されません。 APIの最新バージョンでは、完全に削除されたようです。 (それはFragmentManagerまたはSupportFragmentManagerのドキュメントに記載されていません)。このメソッドは使用しないでください。このメソッドは文書化されていないため、その動作は信頼できません。

+0

...私は逃しました減価償却に関する警告を出していないので、コメント欄に記載されている回避策も見てきました。私はそれを試してみます。それを指摘してくれてありがとう。 – cipley

+0

@cipley私はそれが実際に "非難され"ているとは思わない。公に利用可能な方法として意図されたことはないようです。 –

+0

おかげさまで@ Code-Apprentice!私はより良い回避策を見つけました。それをテストし、結果は正常です!すぐに回答を投稿します – cipley

関連する問題