第一个标签不显示片段。
我使用以下方法创建新标签。
public static void addNewTab(String TimelineName, String id) {
TabLayout.Tab tab = tabs.newTab();
tab.setText(TimelineName)
tabs.addTab(tab);
adapter.addTab(TimelineName);
}
adapter.add(时间轴)是以下类中的方法:
public class TabsPagerAdapter extends PagerAdapter {
private final ArrayList<CharSequence> myTabList = new ArrayList<>();
int TabPosition = 0;
public static List<Bean_TimelineData> timelineData;
public static TimeLine_Adapter timeLineAdapter;
public static RecyclerView timelineRecyclerView;
// CREATE NEW TAB
public void addTab(String title) {
myTabList.add(title);
notifyDataSetChanged();
}
public void removeTab() {
if (!myTabList.isEmpty()) {
myTabList.remove(myTabList.size() - 1);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return myTabList.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
LinearLayout linearLayout = new LinearLayout(container.getContext());
timelineRecyclerView = new RecyclerView(container.getContext());
SwipeRefreshLayout swipeContainer;
timelineData = new ArrayList<Bean_TimelineData>();
timeLineAdapter = new TimeLine_Adapter(container.getContext(), timelineData, TabId);
timelineRecyclerView.setLayoutManager(new LinearLayoutManager(container.getContext()));
timelineRecyclerView.setAdapter(timeLineAdapter);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setBackgroundColor(Color.parseColor("#f2f2f2"));
container.addView(linearLayout, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
params.setMargins(0, 20, 0, 0);
timelineRecyclerView.setLayoutParams(params);
linearLayout.addView(timelineRecyclerView);
return linearLayout;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public CharSequence getPageTitle(int position) {
return myTabList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
但我得到的结果是:
让所有标签正常工作:
如果我将标签从1滑动到3然后再返回1,则片段会正确显示。
我已经检查过一些关于此的帖子,例如:This SO post
什么都没有。
修改
我想动态添加标签。 在第一个选项卡上没有调用tab pageradapter。这就是为什么第一个选项卡显示为空,其余都正常工作。
答案 0 :(得分:2)
使用FragmentPagerAdapter
。
public class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragmentList = new ArrayList<>();
private 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);
}
}
要将Fragment
添加到FragmentPagerAdapter
,请关注它 -
public class WeatherFragment extends Fragment {
private Toolbar toolbar;
private ViewPager viewPager;
private ViewPagerAdapter viewPagerAdapter;
private TabLayout tabLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View weatherFragment = inflater.inflate(R.layout.layout_weather_fragment, container, false);
//setup viewpager
viewPager = (ViewPager) weatherFragment.findViewById(R.id.viewpager);
tabLayout = (TabLayout) weatherFragment.findViewById(R.id.tabs);
viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
viewPagerAdapter.addFragment(new TodayTabFragment(), "Tab 1");
viewPagerAdapter.addFragment(new TomorrowTabFragment(),"Tab 2");
viewPagerAdapter.addFragment(new TenDaysTabFragment(), "Tab 3");
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
return weatherFragment;
}
Fragment
的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
android:background="@color/colorlightBlue"
app:tabGravity="fill"
app:tabTextColor="@color/colorWhite"
app:tabSelectedTextColor="@color/colorWhite"
app:tabIndicatorColor="@color/colorWhite"
app:tabIndicatorHeight="2dp"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbarAlwaysDrawHorizontalTrack="true"/>
</LinearLayout>
答案 1 :(得分:1)
我认为最好的解决方案是更改您的实现,我更喜欢使用FragmentPageAdapter
,它将为每个页面返回一个片段。然后,您可以单独控制每个片段内的内容。
MainActivity:
public class MainActivity extends AppCompatActivity {
private ViewPager mViewPager;
private TabLayout mTabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_main)
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(new TabsPager(this));
mTabLayout = (TabLayout) findViewById(R.id.tabs);
assert mTabLayout != null;
mTabLayout.setupWithViewPager(mViewPager);
}
和我的适配器:
private class TabsPager extends FragmentPagerAdapter {
private final Context mContext;
private Holder[] holders = new Holder[]{
new Holder(getString(R.string.fragment_title), YourFragment.class),
new Holder(getString(R.string.fragment_title2), YourFragment2.class)
};
class Holder {
final CharSequence title;
final Class<?> cls;
Holder(CharSequence title, Class<?> cls) {
this.title = title;
this.cls = cls;
}
}
TabsPager(FragmentActivity fa) {
super(fa.getSupportFragmentManager());
mContext = fa;
}
@Override
public Fragment getItem(int position) {
return Fragment.instantiate(mContext, holders[position].cls.getName());
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
return holders[position].title;
}
}
}
您可以根据需要更改Holder类并添加任何片段。
答案 2 :(得分:0)
如果你需要一个动态的 FragmentPagerAdapter,那么你可以这样做:
public class DynamicFragmentPagerAdapter extends PagerAdapter {
private static final String TAG = "DynamicFragmentPagerAdapter";
private final FragmentManager fragmentManager;
public static abstract class FragmentIdentifier implements Parcelable {
private final String fragmentTag;
private final Bundle args;
public FragmentIdentifier(@NonNull String fragmentTag, @Nullable Bundle args) {
this.fragmentTag = fragmentTag;
this.args = args;
}
protected FragmentIdentifier(Parcel in) {
fragmentTag = in.readString();
args = in.readBundle(getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(fragmentTag);
dest.writeBundle(args);
}
protected final Fragment newFragment() {
Fragment fragment = createFragment();
Bundle oldArgs = fragment.getArguments();
Bundle newArgs = new Bundle();
if(oldArgs != null) {
newArgs.putAll(oldArgs);
}
if(args != null) {
newArgs.putAll(args);
}
fragment.setArguments(newArgs);
return fragment;
}
protected abstract Fragment createFragment();
}
private ArrayList<FragmentIdentifier> fragmentIdentifiers = new ArrayList<>();
private FragmentTransaction currentTransaction = null;
private Fragment currentPrimaryItem = null;
public DynamicFragmentPagerAdapter(FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
}
private int findIndexIfAdded(FragmentIdentifier fragmentIdentifier) {
for (int i = 0, size = fragmentIdentifiers.size(); i < size; i++) {
FragmentIdentifier identifier = fragmentIdentifiers.get(i);
if (identifier.fragmentTag.equals(fragmentIdentifier.fragmentTag)) {
return i;
}
}
return -1;
}
public void addFragment(FragmentIdentifier fragmentIdentifier) {
if (findIndexIfAdded(fragmentIdentifier) < 0) {
fragmentIdentifiers.add(fragmentIdentifier);
notifyDataSetChanged();
}
}
public void removeFragment(FragmentIdentifier fragmentIdentifier) {
int index = findIndexIfAdded(fragmentIdentifier);
if (index >= 0) {
fragmentIdentifiers.remove(index);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return fragmentIdentifiers.size();
}
@Override
public void startUpdate(@NonNull ViewGroup container) {
if (container.getId() == View.NO_ID) {
throw new IllegalStateException("ViewPager with adapter " + this
+ " requires a view id");
}
}
@SuppressWarnings("ReferenceEquality")
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
final FragmentIdentifier fragmentIdentifier = fragmentIdentifiers.get(position);
// Do we already have this fragment?
final String name = fragmentIdentifier.fragmentTag;
Fragment fragment = fragmentManager.findFragmentByTag(name);
if (fragment != null) {
currentTransaction.attach(fragment);
} else {
fragment = fragmentIdentifier.newFragment();
currentTransaction.add(container.getId(), fragment, fragmentIdentifier.fragmentTag);
}
if (fragment != currentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
currentTransaction.detach((Fragment) object);
}
@SuppressWarnings("ReferenceEquality")
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment) object;
if (fragment != currentPrimaryItem) {
if (currentPrimaryItem != null) {
currentPrimaryItem.setMenuVisibility(false);
currentPrimaryItem.setUserVisibleHint(false);
}
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
currentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(@NonNull ViewGroup container) {
if (currentTransaction != null) {
currentTransaction.commitNowAllowingStateLoss();
currentTransaction = null;
}
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public Parcelable saveState() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("fragmentIdentifiers", fragmentIdentifiers);
return bundle;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
Bundle bundle = ((Bundle)state);
bundle.setClassLoader(loader);
fragmentIdentifiers = bundle.getParcelableArrayList("fragmentIdentifiers");
}
}