2016-07-22 2 views
0

FragmentPagerAdapterに問題があります。Android TabPagerAdapter:古いAPIで正常に動作しない

私はアプリの他の部分でうまく使用しましたが、今はこの厄介な問題に取り組んでいます:古いAPIでは、あるタブから別のタブにスワイプすると、すべてがうまく機能しますが、タイトルをクリックしてタブを変更すると、選択されますが、基本となるフラグメントは変更されません。

この問題は、このページャが別のフラグメント内にネストされていることが原因と考えられるようになりました。それでも、タブをスワイプして変更することはできますが、タイトルをクリックすることはできません。ここで

は私のコードです:あなたは、私が推測する新しいフラグメントを作成しているフラグメントで

public class PetrolStationFragment extends Fragment { 

private PetrolStation mPetrolStation; 

private int mPetrolStationIndex; 

private AppCompatImageView mLogo; 
private TextView mNameTextView; 
private CheckBox mCheckBox; 
private TextView mAddressTextView; 
private TextView mDistanceTextView; 
private Switch mSwitch; 
private GoogleMap mGoogleMap; 

private static TabLayout mTabLayout; 
private static ViewPager mViewPager; 
private static int intItems = 2; 


// Design pattern to instantiate a new fragment. 
public static PetrolStationFragment newInstance(int petrolStationIndex) { 
    Bundle args = new Bundle(); 
    args.putInt(ARG_PETROL_STATION_INDEX, petrolStationIndex); 

    PetrolStationFragment fragment = new PetrolStationFragment(); 
    fragment.setArguments(args); 

    return fragment; 
} 

/********************************************************/ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mPetrolStationIndex = getArguments().getInt(ARG_PETROL_STATION_INDEX); 
    mPetrolStation = PetrolStationsArray.get().getItem(mPetrolStationIndex); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceStace) { 
    View view = inflater.inflate(R.layout.fragment_petrol_station, container, false); 

    mLogo = (AppCompatImageView) view.findViewById(R.id.ps_logo); 
    mNameTextView = (TextView) view.findViewById(R.id.petrol_station); 
    mCheckBox = (CheckBox) view.findViewById(R.id.checkbox); 
    mAddressTextView = (TextView) view.findViewById(R.id.address); 
    mDistanceTextView = (TextView) view.findViewById(R.id.distance); 
    mSwitch = (Switch) view.findViewById(R.id.on_service); 

    mLogo.setImageDrawable(ContextCompat.getDrawable(getActivity(), getPetrolStationLogo(mPetrolStation.getLogo()))); 
    mNameTextView.setText(mPetrolStation.getName()); 
    mCheckBox.setChecked(mPetrolStation.isFavourite()); 
    mAddressTextView.setText(mPetrolStation.getAddress()); 

    // To start the marquee-effect on the address TextView. 
    mAddressTextView.setSelected(true); 

    LatLng centre = getLocation(); 
    LatLng point = new LatLng(mPetrolStation.getLat(), mPetrolStation.getLon()); 

    if (centre == null) { 
     mDistanceTextView.setText(getResources().getString(R.string.distence_nd)); 
    } else { 
     double distance = computeDistance(centre, point); 
     mDistanceTextView.setText(getResources().getString(R.string.distance_km, distance)); 
    } 

    // TODO: to fix. 
    mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isFavourite) { 
      // mPetrolStation.setFavourite(isFavourite); 
     } 
    }); 

    ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(GoogleMap googleMap) { 
      mGoogleMap = googleMap; 
      mGoogleMap.getUiSettings().setAllGesturesEnabled(false); 

      double lat = mPetrolStation.getLat(); 
      double lon = mPetrolStation.getLon(); 
      LatLng latLng = new LatLng(lat, lon); 

      mGoogleMap.addMarker(new MarkerOptions().position(latLng)); 

      CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15); 
      mGoogleMap.moveCamera(cameraUpdate); 
     } 
    }); 

    // Setup Views. 
    mTabLayout = (TabLayout) view.findViewById(R.id.pager_header); 
    mViewPager = (ViewPager) view.findViewById(R.id.pager); 

    // Set an Adapter for the View Pager. 
    TabPagerAdapter tabPagerAdapter = new TabPagerAdapter(getChildFragmentManager()); 
    mViewPager.setAdapter(tabPagerAdapter); 
    mTabLayout.setupWithViewPager(mViewPager); 

    mViewPager.setCurrentItem(SELF_SERVICE_TAB_POSITION); 

    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      mViewPager.setCurrentItem(tab.getPosition()); 
     } 

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

     } 

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

     } 
    }); 

    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
} 

class TabPagerAdapter extends FragmentPagerAdapter { 

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

    // Return fragment with respect to position. 
    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment; 

     switch (position) { 

      case SELF_SERVICE_TAB_POSITION: { 
       fragment = SelfServiceFragment.newInstance(mPetrolStationIndex); 

       return fragment; 
      } 

      case FULL_SERVICE_TAB_POSITION: { 
       fragment = FullServiceFragment.newInstance(mPetrolStationIndex); 

       return fragment; 
      } 

     } 

     return null; 
    } 

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

    // This method returns the title of the tab according to its position. 
    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 

      case SELF_SERVICE_TAB_POSITION: { 
       String mSelfService = getResources().getString(R.string.self_service); 

       return mSelfService; 
      } 

      case FULL_SERVICE_TAB_POSITION: { 
       String mFullService = getResources().getString(R.string.full_service); 

       return mFullService; 
      } 

     } 

     return null; 
    } 

} 

} 

答えて

0

解決方法はかなりわかりました:私はstatic TabLayoutstatic ViewPagerを使用していました。私のTabPagerは別のViewPagerの中にあるので間違いでした。

0

。私はシナリオの似たようなものでフラグメントを使用していたと私はtabadapter.theコードで新しいフラグメントのインスタンスを作成し、このようなものになります。

パブリッククラスTabsPagerAdapterは{

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

@Override 
public Fragment getItem(int position) { 
    switch (position){ 
     case 0: 
      return new MeFragment(); 
     case 1: 
      return new CommunityFragment(); 
    } 
    return null; 
} 

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

}

FragmentPagerAdapterを拡張します私は多分それに役立つだろう、それを見て、このmainactivityを追加している:

public class MainActivity extends AppCompatActivity { 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 
public static Activity activity; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    activity = this; 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 

    viewPager = (ViewPager)findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

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

} 

private void setupViewPager(ViewPager viewPager){ 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new MeFragment(),"Me"); 
    adapter.addFragment(new CommunityFragment(),"Community"); 
    viewPager.setAdapter(adapter); 
} 

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

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

    @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

私のコードを見ると、これは私がやったのと同じことです。 – Davide3i

+0

あなたのビューページにアダプターを使ってみてください。そのアダプターを通してタブを追加しても問題ありません。 – ibraizQ9

関連する問題