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;
}
}
}
私のコードを見ると、これは私がやったのと同じことです。 – Davide3i
あなたのビューページにアダプターを使ってみてください。そのアダプターを通してタブを追加しても問題ありません。 – ibraizQ9