Android:ViewPager根视图被替换了吗?
我正在使用带有片段的ViewPager 寻呼机适配器Android:ViewPager根视图被替换了吗?,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我正在使用带有片段的ViewPager 寻呼机适配器 class MainPagerAdapter extends FragmentPagerAdapter { public MainPagerAdapter( FragmentManager fm ) { super( fm ); } @Override public Fragment getItem( int pos ) { F
class MainPagerAdapter extends FragmentPagerAdapter {
public MainPagerAdapter( FragmentManager fm ) {
super( fm );
}
@Override
public Fragment getItem( int pos ) {
Fragment fragment = DetailedFragment.newInstance( pos );
return fragment;
}
@Override
public int getCount() {
return Ad.items.size();
}
@Override
public CharSequence getPageTitle( int position ) {
return Ad.items.get( position ).getTitle();
}
}
碎片
public class DetailedFragment extends Fragment implements OnClickListener {
View rootView;
int item_pos;
Button btn;
MyScrollView scrollView;
public static DetailedFragment newInstance( int pos ) {
DetailedFragment f = new DetailedFragment();
Bundle b = new Bundle();
b.putInt( "pos", pos );
f.setArguments( b );
return f;
}
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
rootView = inflater.inflate( R.layout.detailed_fragment, container, false );
item_pos = getArguments().getInt( "pos" );
btn = ( Button ) rootView.findViewById( R.id.detailed_fragment_btn );
btn.setOnClickListener( this );
scrollView = ( MyScrollView ) rootView.findViewById( R.id.detailed_fragment_scroll );
scrollView.setOnEndScrollListener( this );
....
return rootView;
}
@Override
public void onClick( View v ) {
switch ( v.getId() ) {
case R.id.detailed_fragment_btn:
Log.e( "Hello", "Pos: " + item_pos );
break;
}
}
}
当按下按钮时,我得到当前项目+2(如果我在第一个片段,则为3)。因为它直接加载3个片段
// Does not help
pager.setOffscreenPageLimit( 0 );
// Does not help
btn = ( Button ) pager.getChildAt( pos ).getRootView().findViewById( R.id.detailed_fragment_btn );
这导致了我的主要问题,即:
在每个片段内的滚动视图中滚动时,我需要能够使用setTranslationY移动线性布局。滚动时,它会移动(我猜是因为我看不到它)当前片段+2处的布局
使用自定义滚动视图
@Override
public void onScrollChanged( MyScrollView scrollView, int x, int y, int oldx, int oldy ) {
// Does not do any difference if i set these again
scrollView = ( MyScrollView ) DetailedActivity.pager.getChildAt( item_pos ).getRootView().findViewById( R.id.detail_scrollview );
scrollView.setOnEndScrollListener( this );
// Try to move
holder= ( LinearLayout ) DetailedActivity.pager.getChildAt( item_pos ).getRootView().findViewById( R.id.sections_detail_imgholder );
holder.setTranslationY( y / 2.5f );
}
自定义滚动视图
public class MyScrollView extends ScrollView {
public interface OnEndScrollListener {
public void onEndScroll();
void onScrollChanged( MyScrollView scrollView, int x, int y, int oldx, int oldy );
}
private boolean mIsFling;
private OnEndScrollListener mOnEndScrollListener;
public MyScrollView( Context context ) {
this( context, null, 0 );
}
public MyScrollView( Context context, AttributeSet attrs ) {
this( context, attrs, 0 );
}
public MyScrollView( Context context, AttributeSet attrs, int defStyle ) {
super( context, attrs, defStyle );
}
@Override
public void fling( int velocityY ) {
super.fling( velocityY );
mIsFling = true;
}
@Override
protected void onScrollChanged( int x, int y, int oldX, int oldY ) {
super.onScrollChanged( x, y, oldX, oldY );
if ( mIsFling ) {
if ( Math.abs( y - oldY ) < 2 || y >= getMeasuredHeight() || y == 0 ) {
if ( mOnEndScrollListener != null ) {
mOnEndScrollListener.onEndScroll();
}
mIsFling = false;
}
}
if ( mOnEndScrollListener != null ) {
mOnEndScrollListener.onScrollChanged( this, x, y, oldX, oldY );
}
}
public OnEndScrollListener getOnEndScrollListener() {
return mOnEndScrollListener;
}
public void setOnEndScrollListener( OnEndScrollListener mOnEndScrollListener ) {
this.mOnEndScrollListener = mOnEndScrollListener;
}
}
公共类MyScrollView扩展了ScrollView{
公共接口OnEndScrollListener{
公共无效的onEndScroll();
void onScrollChanged(MyScrollView滚动视图、int x、int y、int oldx、int oldy);
}
私有布尔失配;
私有OnEndScrollListener mOnEndScrollListener;
公共MyScrollView(上下文){
这个(上下文,null,0);
}
公共MyScrollView(上下文、属性集属性){
这(上下文,属性,0);
}
公共MyScrollView(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
公开无效投掷(int-velocityY){
super.fling(velocityY);
错配=真;
}
@凌驾
CrollChanged上的受保护无效(整数x、整数y、整数oldX、整数oldY){
super.onScrollChanged(x,y,oldX,oldY);
如果(不匹配){
if(Math.abs(y-oldY)<2 | | y>=getMeasuredHeight()| | y==0){
if(mOnEndScrollListener!=null){
mOnEndScrollListener.onEndScroll();
}
错配=错误;
}
}
if(mOnEndScrollListener!=null){
mOnEndScrollListener.onScrollChanged(this,x,y,oldX,oldY);
}
}
公共OnEndScrollListener getOnEndScrollListener(){
返回mOnEndScrollListener;
}
public void setOnEndScrollListener(OnEndScrollListener mOnEndScrollListener){
this.mOnEndScrollListener=mOnEndScrollListener;
}
}
移动对第一个片段有效,但如果我转到viewpager中的任何其他片段,则不起作用