2016-07-22 8 views
0

Ich habe ein Problem mit einem FragmentPagerAdapter.Android TabPagerAdapter: funktioniert nicht richtig auf älteren APIs

Ich habe es erfolgreich in anderen Teilen meiner App verwendet, aber jetzt habe ich auf dieses unangenehme Problem gestoßen: auf älteren APIs, wenn ich von einem Tab zum anderen wische, funktioniert alles einwandfrei, aber wann Ich ändere den Tab, indem ich auf den Titel klicke, er wird ausgewählt, aber das darunterliegende Fragment ändert sich nicht.

Ich habe angefangen zu denken, dass das Problem durch die Tatsache verursacht werden kann, dass dieser Pager in einem anderen Fragment verschachtelt ist. Trotzdem ist es so seltsam, dass ich den Tab wechseln kann, indem ich ihn wische, aber nicht, indem ich auf den Titel klicke.

Hier ist mein Code:

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; 
    } 

} 

} 

Antwort

0

Die Lösung war ziemlich offensichtlich: Ich benutzte eine static TabLayout und eine static ViewPager: Es war ein Fehler, weil mein TabPager in einem anderen ViewPager ist.

0

in einem Fragment Sie neue Fragmente schaffen, denke ich. Ich habe Fragmente in einer ähnlichen Art von Szenario verwendet und ich schaffte neue Fragment-Instanzen in dem tabadapter.the Code sieht etwa so aus:

public class TabsPagerAdapter erweitert FragmentPagerAdapter {

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; 
} 

}

ich füge dieses mainactivity Blick auf sie haben, vielleicht wird es helfen:

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

Wenn Sie sich meinen Code anschauen, ist das das gleiche, was ich gemacht habe. – Davide3i

+0

Probieren Sie einen Adapter für Ihren Viewpager, ich habe die Tabs durch diesen Adapter hinzugefügt und es hat gut funktioniert. – ibraizQ9