1

このトピックには他にもいくつかの記事がありますが、私の問題を引き起こしているエラーが存在する可能性があるので、コードを貼りたいと思います。私のFragmentStatePagerAdapterが間違った位置を返しているのですが、なぜそれがわからないのですか?FragmentStatePagerAdapter - getItem

ここは私の主な活動のコードです。

Main.java

import android.content.Context; 
    import android.content.Intent; 
    import android.graphics.Typeface; 
    import android.os.Bundle; 
    import android.support.design.widget.TabLayout; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentTabHost; 
    import android.support.v4.content.ContextCompat; 
    import android.support.v4.view.ViewPager; 
    import android.support.v7.app.ActionBar; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.LayoutInflater; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.ImageButton; 
    import android.widget.ImageView; 
    import android.widget.TabHost.OnTabChangeListener; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import com.google.android.gms.common.ConnectionResult; 
    import com.google.android.gms.common.GoogleApiAvailability; 
    import com.google.android.gms.gcm.GoogleCloudMessaging; 
    import com.microsoft.windowsazure.notifications.NotificationsManager; 

    import java.util.ArrayList; 

    public class Main extends AppCompatActivity { 

     public static TextView txtViewHeading; 
     public static TextView tab1TabBadge; 
     public static TextView tab2TabBadge; 
     public static TextView tab3TabBadge; 
     public static TextView tab4TabBadge; 
     public static TextView tab5TabBadge; 
     public static Button btnBack; 
     public static ImageButton btnShare; 
     public static Main mainActivity; 
     public static Context mainActivityContext; 
     public static Boolean isVisible = false; 
     private FragmentTabHost mTabHost; 
     private GoogleCloudMessaging gcm; 
     private ActionBar actionBar; 
     private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 

     private TabGroupAdapter mTabGroupAdapter; 
     private ViewPager mViewPager; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      // Set up Push notifications 
      mainActivity = this; 
      mainActivityContext = Main.this; 
      NotificationsManager.handleNotifications(this, NotificationSettings.SenderId, PushHandler.class); 
      registerWithNotificationHubs(); 

      // Set up the views for each tab - custom view used for Badge icon 
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      // Bind the Toolbar 
      Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
      setSupportActionBar(toolbar); 

      // Set up the ActionBar 
      actionBar = getSupportActionBar(); 
      if (actionBar!=null) { 
       actionBar.setDisplayHomeAsUpEnabled(true); 
       actionBar.setHomeButtonEnabled(true); 
      } 

      // Create the adapter that will return a fragment for each of the primary "tabs" 
      mTabGroupAdapter = new TabGroupAdapter(getSupportFragmentManager()); 

      // Set up the ViewPager with the sections adapter. 
      mViewPager = (ViewPager) findViewById(R.id.container); 
      mViewPager.setAdapter(mTabGroupAdapter); 

      TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
      tabLayout.setupWithViewPager(mViewPager); 

      // tab1 Tab 
      View tab1TabView = inflater.inflate(R.layout.tab, null); 
      ImageView tab1TabIcon = (ImageView) tab1TabView.findViewById(R.id.tabIcon); 
      tab1TabIcon.setImageResource(R.drawable.tab_first); 
      TextView tab1TabText = (TextView) tab1TabView.findViewById(R.id.tabText); 
      tab1TabText.setText("tab1"); 
      tab1TabText.setTypeface(arialTypeface); 
      tab1TabBadge = (TextView) tab1TabView.findViewById(R.id.tabBadge); 
      tab1TabBadge.setTypeface(arialTypeface); 
      tabLayout.getTabAt(0).setCustomView(tab1TabView); 
      // Also set this tab as Active be default 
      tabLayout.getTabAt(0).getCustomView().setSelected(true); 
      mViewPager.setCurrentItem(0); 

      // tab2 Tab 
      View tab2TabView = inflater.inflate(R.layout.tab, null); 
      ImageView tab2TabIcon = (ImageView) tab2TabView.findViewById(R.id.tabIcon); 
      tab2TabIcon.setImageResource(R.drawable.tab_second); 
      TextView tab2TabText = (TextView) tab2TabView.findViewById(R.id.tabText); 
      tab2TabText.setText("Odometer"); 
      tab2TabText.setTypeface(arialTypeface); 
      tab2TabBadge = (TextView) tab2TabView.findViewById(R.id.tabBadge); 
      tab2TabBadge.setTypeface(arialTypeface); 
      tabLayout.getTabAt(1).setCustomView(tab2TabView); 

      // tab3 Tab 
      View tab3TabView = inflater.inflate(R.layout.tab, null); 
      ImageView tab3TabIcon = (ImageView) tab3TabView.findViewById(R.id.tabIcon); 
      tab3TabIcon.setImageResource(R.drawable.tab_third); 
      TextView tab3TabText = (TextView) tab3TabView.findViewById(R.id.tabText); 
      tab3TabText.setText("tab3"); 
      tab3TabText.setTypeface(arialTypeface); 
      tab3TabBadge = (TextView) tab3TabView.findViewById(R.id.tabBadge); 
      tab3TabBadge.setTypeface(arialTypeface); 
      tabLayout.getTabAt(2).setCustomView(tab3TabView); 

      // tab4 Tab 
      View tab4TabView = inflater.inflate(R.layout.tab, null); 
      ImageView tab4TabIcon = (ImageView) tab4TabView.findViewById(R.id.tabIcon); 
      tab4TabIcon.setImageResource(R.drawable.tab_fourth); 
      TextView tab4TabText = (TextView) tab4TabView.findViewById(R.id.tabText); 
      tab4TabText.setText("tab4"); 
      tab4TabText.setTypeface(arialTypeface); 
      tab4TabBadge = (TextView) tab4TabView.findViewById(R.id.tabBadge); 
      tab4TabBadge.setTypeface(arialTypeface); 
      tabLayout.getTabAt(3).setCustomView(tab4TabView); 

      // tab5 Tab 
      View tab5TabView = inflater.inflate(R.layout.tab, null); 
      ImageView tab5TabIcon = (ImageView) tab5TabView.findViewById(R.id.tabIcon); 
      tab5TabIcon.setImageResource(R.drawable.tab_fifth); 
      TextView tab5TabText = (TextView) tab5TabView.findViewById(R.id.tabText); 
      tab5TabText.setText("tab5"); 
      tab5TabText.setTypeface(arialTypeface); 
      tab5TabBadge = (TextView) tab5TabView.findViewById(R.id.tabBadge); 
      tab5TabBadge.setTypeface(arialTypeface); 
      tabLayout.getTabAt(4).setCustomView(tab5TabView); 

      // Tab listener 
      /* 
      tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
       @Override 
       public void onTabSelected(TabLayout.Tab tab) { 
        txtViewHeading.setText(tab.getText()); 
       } 

       @Override 
       public void onTabUnselected(TabLayout.Tab tab) { 

       } 

       @Override 
       public void onTabReselected(TabLayout.Tab tab) { 

       } 
      }); 
      */ 

     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       if(mViewPager.getCurrentItem()==0){ 
        onBackPressed(); 
       } 
       else{ 
        mViewPager.setCurrentItem(mViewPager.getCurrentItem()-1); 
       } 
      } 
      return super.onOptionsItemSelected(item); 
     } 

     @Override 
     protected void onPause() { 
      super.onPause(); 
      isVisible = false; 
     } 

     @Override 
     protected void onResume() { 
      super.onResume(); 
      isVisible = true; 
     } 

     @Override 
     protected void onStop() { 
      super.onStop(); 
      isVisible = false; 
     } 

     private boolean checkPlayServices() { 
      GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
      int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); 
      if (resultCode != ConnectionResult.SUCCESS) { 
       if (apiAvailability.isUserResolvableError(resultCode)) { 
        apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) 
          .show(); 
       } else { 
        ToastNotify("This device is not supported by Google Play Services."); 
        finish(); 
       } 
       return false; 
      } 
      return true; 
     } 

     public void ToastNotify(final String notificationMessage) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(Main.this, notificationMessage, Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 

     private void registerWithNotificationHubs() 
     { 
      if (checkPlayServices()) { 
       // Start IntentService to register this application with GCM. 
       Intent intent = new Intent(this, RegistrationIntentService.class); 
       startService(intent); 
      } 
     } 

    } 

...と、ここは私のアプリの負荷、それをまとめるために、私のFragmentStatePagerAdapterのコード

TabGroupAdapter

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.util.Log; 

import java.util.ArrayList; 


public class TabGroupAdapter extends FragmentStatePagerAdapter { 

    private static int fragmentSize = 5; 
    private static ArrayList<String> fragmentTitles = new ArrayList<String>() { 
     { 
      add("tab1"); 
      add("tab2"); 
      add("tab3"); 
      add("tab4"); 
      add("tab5"); 
     } 
    }; 

    public TabGroupAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.d("tag","POSITION: " + position); 
     switch (position) { 
      case 0: 
      default: 
       return new Tab1Fragment(); 
      case 1: 
       return new Tab2Fragment(); 
      case 2: 
       return new Tab3Fragment(); 
      case 3: 
       return new Tab4Fragment(); 
      case 4: 
       return new Tab5Fragment(); 
     } 
    } 

    @Override 
    public int getCount() { 
     return fragmentSize; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return fragmentTitles.get(position); 
    } 


} 

です、最初のタブは空です。ただ空白の画面。それは私のTab1Fragmentではありません。また、私は自分のタブをクリックすると、私は5つのタブがあるので、位置は左から右に0,1,2,3,4表示される必要があります。しかし、それはしません。私は現在の位置をコンソールに記録しているgetItem(position)メソッドにLog.dステートメントを持っています。私のアプリがロードされるときにPosition:0、Position:1が読み込まれます。これはデフォルトのタブ(tab1)なので、位置0だけを表示する必要があるので変です。次にクリックすると、タブ2は位置2を、タブ3は位置3を、タブ4は位置4を、タブ5はまったくログに記録しません。その後、タブ5からタブ1に戻って作業すると、その位置はすべて外れてしまい、タブ1になるとログに記録されません。それはかなり奇妙です。また、私の断片の中の私の背中の矢は、私がタブの根の断片にないならば、現れなければならず、常に現れます。

誰も私がなぜこれが起こっているのか理解してもらえますか? 問題を特定するためのコードがさらに必要な場合は、私が投稿していただきたいことがありましたら、私にあなたが見たいものをお知らせください。あなたのonCreateメソッドで

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 

答えて

1

は、下のコードのすべてをコメントアウトしてみます。再度実行し、何が起こるかを見てください。

あなたのswitch文は、奇妙な方法で配置されています。間違いなく5つのケースがある場合は、ケース0-4から、ログにエラーを出力するか、例外をスローする最後のデフォルトのケースが必要です。私はこれがあなたの問題を引き起こすとは思わないが、それはよい習慣である。

また、デフォルトコンストラクタを使用してフラグメントをインスタンス化することは、通常はお勧めできません。オブジェクトを初期化あなたのフラグメントにおける静的create()メソッドと

Tab1Fragment fragment = Tab1Fragment.create(); 
return fragment; 

:良い方法は静的なファクトリメソッド、つまりを使用することです。これにより、断片化する単一のアクセスポイントが得られ、実行する必要のある初期化(現在または途中で)を一度に実行できるため、エラーが発生しにくくなります。 Androidでは、デフォルトのコンストラクタを使用してフラグメントも再作成されるため、オーバーロードされたコンストラクタで行う初期化は無視されます。再び私はこれがあなたの問題の原因だとは思わないが、それは念頭に置く価値がある。

編集:また、あなたはそれがランダムな断片を選んでいると言うとき、あなたはそれらの断片が画面に表示されている意味しています、「位置は0,3,2,0,4,1だけ乱数を表示します」または「getItem(int position)」引数からロギングしている位置ですか?

+0

はあなたの洞察力をありがとうございました。上記のコードの下のコードをコメントアウトしましたが、同じ問題が残っています。私がランダムフラグメントの位置を意味するとき、getItemメソッドから呼び出されるログです。私はLog.d( "Mytag"、 "Position:" + position)を持っています。 getItemメソッド内から取得します。私のアプリケーションが読み込まれると、 "Position:0"、次にPosition:1がロードされます。次に、タブ2をクリックすると、位置:2、タブ3:位置3:タブ4:位置4:タブ5はログに記録されません。私がタブ5からタブ1に戻ってくると、シーケンスは全て駄目です。 – Phil

+0

ここに投稿したコードからダミープロジェクトを作りました。 FragmentStatePagerアダプタは、現在のページとどちらか一方のページを読み込みます。そのため、同時に0と1を記録します。ページ2に切り替えると、ページ3が読み込まれ、ページ1がメモリに保持されます。それから、4ページ目になると何も読み込まれません。3にスクロールしたときに4が読み込まれ、それ以上のものはありません。したがって、getItem()で与えられているintは、現在表示されているページではなく、メモリにロードされているページです。あなたのために物事をクリアすることを願っています。 – Dan

+0

Danありがとうございます。あなたのご意見は、私の問題は返された位置ではなく、むしろ問題が私がロードしている断片にあることに気付くのを助けました。 – Phil

0
viewPager = (ViewPager) findViewById(R.id.tabPager); 
adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new Fragment1(),"fragment 1"); 
     adapter.addFragment(new Fragment2(),"fragment 2"); 
     viewPager.setAdapter(adapter); 


     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
       return position; 
       } 
      } 

      @Override 
      public void onPageSelected(int position) { 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     assert tabLayout != null; 
     tabLayout.setupWithViewPager(viewPager); 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 
     tabLayout.setTabMode(TabLayout.MODE_FIXED); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

は、その後、あなたのアダプタで

class ViewPagerAdapter extends FragmentPagerAdapter { 
private final List<Fragment> mFragmentList = new ArrayList<>(); 
private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment,String title) { 
      mFragmentList.add(fragment); 
mFragmentTitleList.add(title); 

     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 
+0

getPageTitleメソッドが、 の代わりにFragmentを返しています。CharSequence – Phil

関連する問題