第一篇技术博客,好紧脏
之前要修改源生音乐的一个UI界面,大换血,需要尽量整合源生的资源以利用来减少工作量和修改引起的bug。其中,新的UI设计中重新设计歌词显示和歌曲列表界面为左右滑动显示。但是,源生的歌词界面是一个xml布局文件,列表界面是通过继承公共类写好的Fragment。网上找了很多都是单独介绍怎么添加xml到ViewPager中,或者单独添加Fragment到ViewPager中,而且,Fragment的添加还有一个版本限制,好巧,我的这个源生音乐不是那个刚好的版本,两个文件如果自己重新定义很麻烦。所以,重点来了,我就自己研究了一下怎么将这两种不同的文件同时添加到ViewPager中。废话不多说了,捞干的。
private ArrayList<Object> pagers = new ArrayList<>();
private FrameLayout mLyricContentView;
private Fragment mFragment;
private void initViewPager(){
mLyricContentView = (FrameLayout)getLayoutInflater().inflate(R.layout.lyric,null);
pagers.add(mLyricContentView);
mFragment = new TrackBrowserFragment();
Bundle args = new Bundle();
args.putString("playlist", "nowplaying");
args.putBoolean("editValue", true);
mFragment.setArguments(args);
pagers.add(mFragment);
}
class ViewPagerAdapter extends PagerAdapter{
private FragmentTransaction mCurTransaction = null;
private FragmentManager mFragmentManger;
private Fragment mCurrentPrimaryItem = null;
Object mViews;
ViewPagerAdapter(FragmentManager fm){
mFragmentManger = fm;
}
@Override
public int getCount() {
return pagers.size();
}
public Fragment getItem(int position){
Fragment fragment = null;
mViews = pagers.get(position);
if(mViews instanceof Fragment){
fragment = (Fragment) mViews;
}
return fragment;
}
@Override
public void startUpdate(ViewGroup container) {
if (container.getId() == View.NO_ID) {
throw new IllegalStateException("ViewPager with adapter " + this
+ " requires a view id");
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
mViews = pagers.get(position);
Object view = null;
if(mViews instanceof View) {
container.addView((View)mViews);
view = (View)mViews;
}else if(mViews instanceof Fragment){
if (mCurTransaction == null) {
mCurTransaction = mFragmentManger.beginTransaction();
}
final long itemId = getItemId(position);
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManger.findFragmentByTag(name);
if (fragment != null) {
Log.d(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
Log.d(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
view = fragment;
}
return view;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
mViews = pagers.get(position);
if (!(mViews instanceof View)) {
Fragment fragment = (Fragment) object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
mViews = pagers.get(position);
if(mViews instanceof View) {
container.removeView((View)mViews);
}else if(mViews instanceof Fragment) {
if (mCurTransaction == null) {
mCurTransaction = getFragmentManager().beginTransaction();
}
mCurTransaction.detach((Fragment) object);
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitNowAllowingStateLoss();
mCurTransaction = null;
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
boolean isViewFromObject = false;
if(object instanceof View){
isViewFromObject = view == object;
}else if(object instanceof Fragment){
isViewFromObject = ((Fragment)object).getView() == view;
}
return isViewFromObject;
}
public long getItemId(int position) {
return position;
}
private String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
}