2014-10-08 2 views
0

Я хочу, чтобы нажимать на кнопки, чтобы перемещаться вперед и назад через несколько видов, а также прокручивать влево или вправо между видами.Призрачный эффект: два вида друг на друга. Зачем?

Итак, я решил реализовать ViewPager для прокрутки между несколькими видами.

Вот мой код:

расположение XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@color/white" 
     > 

    <android.support.v4.view.ViewPager 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/viewPager"/> 

    <ImageView 
      android:id="@+id/apple" 
      android:layout_width="200sp" 
      android:layout_height="150sp" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:src="@drawable/apple" 
      android:contentDescription="apple"/> 

    <TextView 
      android:id="@+id/number" 
      android:layout_width="100sp" 
      android:layout_height="55sp" 
      android:layout_marginTop="47dp" 
      android:layout_below="@+id/apple" android:layout_alignStart="@+id/apple"/> 

    <Button 
      android:id="@+id/save" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/save" 
      android:layout_alignTop="@+id/ignore" android:layout_toStartOf="@+id/apple"/> 

    <Button 
      android:id="@+id/ignore" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/Ignore" 
      android:layout_alignParentBottom="true" android:layout_toEndOf="@+id/apple"/> 

    <ImageView 
      android:id="@+id/back_nav_arrow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_action_back" 
      android:contentDescription="back"> 
      </ImageView> 


    <ImageView 
      android:id="@+id/forward_nav_arrow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_action_forward" 
      android:layout_alignParentTop="true" android:layout_alignParentEnd="true" 
      android:contentDescription="forward"> 

    </ImageView> 

</RelativeLayout> 

Вот моя активность:

public class CollectionPager extends Activity { 

    private PagerAdapter pagerAdapter; 
    ActionBar actionbar; 
    MyAdapter myAdapter; 
    private Context context; 
    private TextView textView; 
    private int currentPage; 
    ViewPager viewPager; 
    int progressChanged = 0; 

    public static final String TAG = "CollectionPager"; 

    public CollectionPager() { 
     context = this; 
    } 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     super.setContentView(R.layout.collection); 
     viewPager = (ViewPager) findViewById(R.id.viewPager); 

     myAdapter = new MyAdapter(); 
     viewPager.setAdapter(myAdapter); 

     ActionBar actionBar = getActionBar(); 
     if (actionBar != null) { 
      actionBar.hide(); 
     } 

     //Initialize the back button and add an onClick event listener to the button 
     final ImageView back_button = (ImageView) findViewById(R.id.back_nav_arrow); 
     back_button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 

       //it doesn't matter if you're already in the first item 
       viewPager.setCurrentItem(viewPager.getCurrentItem() - 1); 
      } 
     }); 

     //Initialize the forward button and add an onClick event listener to the button 
     final ImageView forward_button = (ImageView) findViewById(R.id.forward_nav_arrow); 
     forward_button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 

       //it doesn't matter if you're already in the last item 
       viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); 
      } 
     }); 

     final Button save_button = (Button) findViewById(R.id.save); 
     save_button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 

       //save 
      } 
     }); 

     final Button ignore_button = (Button) findViewById(R.id.ignore); 
     ignore_button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 

      //ignore 

      } 
     }); 

     //Attach the page change listener inside the activity 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      // This method will be invoked when the current page is scrolled 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      //This method will be invoked when a new page becomes selected 
      @Override 
      public void onPageSelected(int position) { 
       //get position 
       currentPage = position; 

      } 

      // Called when the scroll state changes: 
      // SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING 
      @Override 
      public void onPageScrollStateChanged(int i) { 

       //get state 

      } 
     }); 

    } 

     private class MyAdapter extends PagerAdapter { 


      int NumberOfPages = 10; 

      LayoutInflater inflater = (LayoutInflater) CollectionPager.this 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      @Override 
      public int getCount() { 
       return NumberOfPages; 
      } 

      @Override 
      public Object instantiateItem(ViewGroup parent, int position) { 

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.collection, parent, false); 

        ImageView imageView = (ImageView) view 
          .findViewById(R.id.apple); 
        imageView.setImageResource(R.drawable.apple); 
        parent.addView(view,0); 


        return view; 
      } 

      @Override 
      public void destroyItem(ViewGroup parent, int position, Object object) { 
       ((ViewPager) parent).removeView((View) object); 
      } 

      @Override 
      public boolean isViewFromObject(View parent, Object object) { 
       return parent== ((View) object); 
      } 

      @Override 
      public Parcelable saveState() { 
       return null; 
      } 
     } 
    } 

детектируется onClickEvent но вот скриншот того, что происходит с точки зрения. Два взгляда друг на друга. Один вид фиксируется на экране, а другой - прокручивается правильно.

enter image description here

Я не знаю, почему это происходит. Что вызывает это в моем коде?

EDIT: Вот видео, выдвигая на первый план вопрос: https://www.dropbox.com/s/6x5qa16xyttzrwa/VIDEO0041.mp4?dl=0

+0

я хотел бы посоветовать вам взять одну горизонтальную линейную компоновку, в которой положить ваши все 4 кнопки, т.е. сохранить, игнорировать .... так что на и поставьте эту линейную раскладку ниже, чтобы просмотреть пейджер, или вы можете поставить на просмотр пейджер, сохранив нижний смысл вашего линейного макета. Надеюсь, это поможет вам. –

+0

Можете ли вы привести мне пример? Вы хотите использовать horizontalScrollView? Должен ли я включать viewpager внутри родительского макета над кнопками? –

ответ

1

Изменить

@Override 
    public boolean isViewFromObject(View parent, Object object) { 
     return parent== ((View) object); 
    } 

в

@Override 
public boolean isViewFromObject(View v, Object o) { 
    return parent == object; 
} 

Update:

После просмотра фильма ваша проблема вы положили некоторые static wedget в верхней части вашего viewpager, так что удалите это, что означает, что ваш макет станет чем-то вроде этого:

Это ваш main_activity.xml вы должны назначить его на свой activity функцией setContentView

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@color/white" 
     > 

    <android.support.v4.view.ViewPager 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/viewPager"/> 

</RelativeLayout> 

затем при instantiateItem использования ниже макета:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@color/white" 
    > 

<ImageView 
     android:id="@+id/apple" 
     android:layout_width="200sp" 
     android:layout_height="150sp" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:src="@drawable/apple" 
     android:contentDescription="apple"/> 

<TextView 
     android:id="@+id/number" 
     android:layout_width="100sp" 
     android:layout_height="55sp" 
     android:layout_marginTop="47dp" 
     android:layout_below="@+id/apple" android:layout_alignStart="@+id/apple"/> 

<Button 
     android:id="@+id/save" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/save" 
     android:layout_alignTop="@+id/ignore" android:layout_toStartOf="@+id/apple"/> 

<Button 
     android:id="@+id/ignore" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/Ignore" 
     android:layout_alignParentBottom="true" android:layout_toEndOf="@+id/apple"/> 

<ImageView 
     android:id="@+id/back_nav_arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_action_back" 
     android:contentDescription="back"> 
     </ImageView> 


<ImageView 
     android:id="@+id/forward_nav_arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_action_forward" 
     android:layout_alignParentTop="true" android:layout_alignParentEnd="true" 
     android:contentDescription="forward"> 

</ImageView> 

Ваше основное направление деятельности:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    super.setContentView(R.layout.collection); 
    viewPager = (ViewPager) findViewById(R.id.viewPager); 

    myAdapter = new MyAdapter(); 
    viewPager.setAdapter(myAdapter); 

    ActionBar actionBar = getActionBar(); 
    if (actionBar != null) { 
     actionBar.hide(); 
    } 

    //Attach the page change listener inside the activity 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     // This method will be invoked when the current page is scrolled 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     //This method will be invoked when a new page becomes selected 
     @Override 
     public void onPageSelected(int position) { 
      //get position 
      currentPage = position; 

     } 

     // Called when the scroll state changes: 
     // SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING 
     @Override 
     public void onPageScrollStateChanged(int i) { 

      //get state 

     } 
    }); 

} 

затем присвоить щелчок слушателя вашей основной деятельности в этой функции

 @Override 
     public Object instantiateItem(ViewGroup parent, int position) { 

       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.collection, parent, false); 

       ImageView imageView = (ImageView) view 
         .findViewById(R.id.apple); 
       imageView.setImageResource(R.drawable.apple); 

       final ImageView back_button = (ImageView) view.findViewById(R.id.back_nav_arrow); 
       back_button.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 

        //it doesn't matter if you're already in the first item 
        viewPager.setCurrentItem(viewPager.getCurrentItem() - 1); 
       } 
       }); 



       parent.addView(view,0); 


       return view; 
     } 
+0

В этом случае родительский элемент не может быть разрешен. Вы имеете в виду return view == object ;? –

+0

Btw, все еще есть проблема :( –

+0

Почему бы вам не использовать фрагмент? – mmlooloo

Смежные вопросы