【问题标题】:View pager skipping to irregular position when I click button in second fragment android?当我单击第二个片段android中的按钮时,查看寻呼机跳到不规则位置?
【发布时间】:2016-12-02 07:06:40
【问题描述】:

我在活动中使用视图寻呼机,顺序是 - 当我单击第一页中的下一个按钮时,它应该转到第二页。如果我单击第二页中的按钮,它应该转到第三页,依此类推。但是我当前的应用程序表现得很奇怪,即当我单击第二页中的下一步按钮时,它会转到第四页。当我再次单击第一页中的第一个按钮时,它会跳转到第三页,依此类推..

这是代码。

public class ViewPagerActivity extends AppCompatActivity {
    private ViewPager pager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager_act);
        setViewPager();

        /*pager.setPageTransformer(true, new ZoomPageTransformer());

        pager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
        pager.post(new Runnable() {
            @Override
            public void run() {
                pager.setCurrentItem(position); //don't know how to use this from fragment
            }
        });*/
    }

    private void setViewPager() {
        pager = (ViewPager) findViewById(R.id.viewPager);
        FragmentManager fm = getSupportFragmentManager();
        ViewPagerAdapter adapter = new ViewPagerAdapter(fm);
        pager.setAdapter(adapter);

    }

    public void setCurrentItem(int selectedPosition) {
        pager.setCurrentItem(selectedPosition, true);
    }

    private class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager supportFragmentManager) {
            super(supportFragmentManager);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return FirstPager.newInstance();
                case 1:
                    return SecondPager.newInstance();
                case 2:
                    return ThirdPager.newInstance();
                case 3:
                    return FourthPager.newInstance();
                case 4:
                    return FifthPager.newInstance();
                case 5:
                    return SixthPager.newInstance();
                default:
                    return null;
            }

        }

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

FirstPager:

public class FirstPager extends Fragment {
    private ImageView slideArrow;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.first_pager, container, false);
        return v;
    }

    public static FirstPager newInstance() {
        FirstPager fragment = new FirstPager ();
        return fragment;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initUI();
    }

    private void initUI() {
        slideArrow = (ImageView) getActivity().findViewById(R.id.next_arrow);
        slideArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ViewPagerActivity)getActivity()).setCurrentItem (1);
            }
        });
    }
}

类似地在其他片段中,我将 currentItem 指定为 2,3,4,5 和 6。但是它的位置行为不正确。

我推荐了一些post,但在我的情况下,我将如何申请从片段传递的方法以使位置正常工作?

【问题讨论】:

  • 你在哪里点击?你在点击什么?
  • 每个片段中都有一个按钮。即下一个按钮。所以当我点击下一个按钮时,它会滑动到下一页。但问题是位置不合适。 @RushiAyyappa
  • 你能发布那个按钮代码吗?

标签: android android-layout android-fragments android-viewpager


【解决方案1】:

我认为最好的方法是:

  viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);

【讨论】:

  • @Shadow 很高兴,可以帮忙:)
【解决方案2】:
slideArrow = (ImageView) getActivity().findViewById(R.id.next_arrow);

您确定,您的调用正确吗?你不是。

您正在调用活动中箭头的 findViewById。 ViewPager 的工作原理是加载此页面,并预加载下一页和上一页以实现平滑滑动。当您单击第一页上的按钮时,将调用最后加载的页面(在您的情况下为第二页)的按钮单击事件。

您必须在每个片段中使用箭头按钮

你可以这样做:

public class FirstPager extends Fragment {
    private ImageView slideArrow;
    View v;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.first_pager, container, false);
        return v;
    }

    public static FirstPager newInstance() {
        FirstPager fragment = new FirstPager ();
        return fragment;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initUI();
    }

    private void initUI() {
        slideArrow = (ImageView) v.findViewById(R.id.next_arrow); // Note the difference in this line.
        slideArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ViewPagerActivity)getActivity()).setCurrentItem (1);
            }
        });
    }
}

【讨论】:

    【解决方案3】:

    你可以在这里做两件事:

    • 首先,您的 viewpager 有一个覆盖方法 onPageSelected(),它返回选择页面的位置。使用这个 poition 元素获取视图并在那里绑定你的按钮并在那里编写监听器并编写 viewpager.setCurrentItem(i++); //如果i是你的当前位置,但一定要检查它是否是最后一项。
    • 其次,你保持当前片段的位置并且
       ((ViewPagerActivity)getActivity()).setCurrentItem (next_frag_pos);
      

    【讨论】:

      【解决方案4】:

      这段代码尝试完美运行。

      public class ViewPagerActivity extends FragmentActivity {
      
      private ViewPager pager;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.viewpager_act);
          setViewPager();
      
          /*pager.setPageTransformer(true, new ZoomPageTransformer());
      
          pager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
          pager.post(new Runnable() {
              @Override
              public void run() {
                  pager.setCurrentItem(position); //don't know how to use this from fragment
              }
          });*/
      }
      
      private void setViewPager() {
          pager = (ViewPager) findViewById(R.id.viewPager);
          FragmentManager fm = getSupportFragmentManager();
          ViewPagerAdapter adapter = new ViewPagerAdapter(fm);
          pager.setAdapter(adapter);
      
      }
      
      public void setCurrentItem(int selectedPosition) {
          pager.setCurrentItem(selectedPosition, true);
      }
      private class ViewPagerAdapter extends FragmentPagerAdapter {
          public ViewPagerAdapter(FragmentManager supportFragmentManager) {
              super(supportFragmentManager);
          }
      
          @Override
          public Fragment getItem(int position) {
              switch (position) {
                  case 0:
                      return new FirstPager();
                  case 1:
                      return new SecondPager();
                  case 2:
                      return new ThirdPager();
                  case 3:
                      return new FourthPager();
                  case 4:
                      return new FifthPager();
                  case 5:
                      return new SixthPager();
                  default:
                      return null;
              }
          }
      
          @Override
          public int getCount() {
              return 6;
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        相关资源
        最近更新 更多