简体   繁体   English

jfeinstein10 / slidingmenu,使用CirclePageIndicator的viewpager无法正常工作

[英]jfeinstein10/slidingmenu, viewpager with CirclePageIndicator not working

I have got a strange situation. 我有一个奇怪的情况。 I am using Slidingmenu,viewpager with CirclePageIndicator. 我正在使用CirclePageIndicator的Slidingmenu,viewpager。 Currently view pager and sliding menu is working but CirclePageIndicator is not indicating the exact page. 当前,查看分页器和滑动菜单正在运行,但是CirclePageIndicator未指示确切的页面。 Any Idea why? 知道为什么吗? The below is the activity code with screenshot. 下面是带有截图的活动代码。 My Code- 我的代码

public class MainActivity extends FragmentActivity {

// Declare Variables
ViewPager viewPager;
PagerAdapter adapter;   
CirclePageIndicator mIndicator; 
private int mWidthScreen;
private int mHeightScreen;  
private Bundle bundle;
private List<Fragment> frgScreens;
private int selectedtheme;
private Handler mHandler = new Handler();
//public  mlayoutForeground;

//Menu buttons
private ImageView mBtnMenu;
private SlidingMenu menu;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the view from viewpager_main.xml
    setContentView(R.layout.viewpager_main);

    getScreenHeightWidhth();    
    buildargument();

    //setting the required theme
    this.selectedtheme=1;       
    initialisePaging(selectedtheme); //Page creating function

    generateMenu();



}

private void initialisePaging(int theme) {  

    // Locate the ViewPager in viewpager_main.xml
    viewPager = (ViewPager) findViewById(R.id.pager);

    //#FIXME try to implement like theme.basic
    //clearing old entries
    frgScreens=new Vector<Fragment>();

    if(theme==1)
    {
        frgScreens=this.basicThemes();
    }

    if(theme==2)
    {   

        frgScreens=this.forecastThemes();
    }


  //Bind result to ViewPagerAdapter 
    adapter =new ViewPagerAdapter(this.getSupportFragmentManager(), frgScreens);

    // Binds the Adapter to the ViewPager
    this.viewPager.setAdapter(adapter);     
    addAndConfigureCirclePagerAdapter();



}


/*
 * forecast theme fragment
 */
private List<Fragment> forecastThemes()
{
    Fragment frgForecast1=Fragment.instantiate(this,ForecastScreen1.class.getName());

    //#FIXME forecast2 problematic
    //Fragment frgForecast2=Fragment.instantiate(this,ForecastScreen2.class.getName());

    frgForecast1.setArguments(bundle);
    //frgForecast2.setArguments(bundle);


    List<Fragment> frgForecastScreens = new Vector<Fragment>();

    frgForecastScreens.add(frgForecast1);
    //frgForecastScreens.add(frgForecast2);

    return frgForecastScreens;

}
/*
 * Basic theme fragments
 */
private List<Fragment> basicThemes()
{
    //declaring fragments Group Basic
    Fragment frgBasic1=Fragment.instantiate(this,Basic1.class.getName());
    Fragment frgBasic2=Fragment.instantiate(this,Basic2.class.getName());
    Fragment frgBasic3=Fragment.instantiate(this,Basic3.class.getName());
    Fragment frgBasic4=Fragment.instantiate(this,Basic4.class.getName());

    //Passing arguments
    frgBasic1.setArguments(bundle);
    frgBasic2.setArguments(bundle);
    frgBasic3.setArguments(bundle);
    frgBasic4.setArguments(bundle);


    //Loading screens into Fragment list
    List<Fragment> frgBasicScreens = new Vector<Fragment>();

    frgBasicScreens.add(frgBasic1);
    frgBasicScreens.add(frgBasic2);
    frgBasicScreens.add(frgBasic3);
    frgBasicScreens.add(frgBasic4);


    return frgBasicScreens;

}


 /*
  * Applying circlepageradapter color
  */
 private void addAndConfigureCirclePagerAdapter()
 {

     this.viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                            super.onPageSelected(position);
                            if (position == 0) {
                                menu.removeIgnoredView(viewPager);
                            } else {
                                menu.addIgnoredView(viewPager);
                            }
                        }
                    });

    mIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
    this.mIndicator.setBackgroundColor(Color.TRANSPARENT);
    this.mIndicator.setPadding(5, 5, 5, 5);
    this.mIndicator.setRadius(12);
    this.mIndicator.setFillColor(Color.argb(255, 175, 220, 243));
    final float density = getResources().getDisplayMetrics().density;
    this.mIndicator.setRadius(6 * density);
    this.mIndicator.setViewPager(viewPager); 


 }

/*
 * Function to get height and width
 * 
 */
private void getScreenHeightWidhth()
{
     DisplayMetrics localDisplayMetrics = new DisplayMetrics();
     getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics);            
     this.mWidthScreen = localDisplayMetrics.widthPixels;
     this.mHeightScreen = localDisplayMetrics.heightPixels; 
     mHandler.post(new DisplayToast(this, "Width Screen:"+ mWidthScreen + ". Height Screen: "+ mHeightScreen+ "."));
}

/*
 * Bundle that bind extra arguments with every fragments
 * mWidthScreen : Putting 'mWidthScreen'as a pasing argument
 */
private void buildargument()
{
    this.bundle = new Bundle();
    bundle.putInt("mWidthScreen", this.mWidthScreen);
}

public void generateMenu()
{
    //enable button
    //buttonsOn();

    mBtnMenu = (ImageView) findViewById(R.id.btnMenu);

    menu = new SlidingMenu(this);
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    menu.setShadowWidth(5);
    menu.setFadeDegree(0.0f);
    menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
    menu.setBehindWidth(500);
    menu.setMenu(R.layout.menu_frame);

    mBtnMenu.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
         // menu.showMenu();

          menu.toggle();
         mBtnMenu.setEnabled(true);
        }
    });





}

public void buttonsOff()
  {
    this.mBtnMenu.setEnabled(false);

  }

  public void buttonsOn()
  {

    this.mBtnMenu.setEnabled(true);
  }


 @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}

When I run the code I found the circlepageindicator indicating first page if I am swiping to different page also. 当我运行代码时,如果我也要滑动到其他页面,则会发现circlepageindicator指示第一页。 Here is the snap short. 这是短片。

screenshot_2015-09-29-14-17-56

Normally It should be like this. 通常情况应该是这样。

screenshot_2015-09-26-08-33-50 1

Any code help would be appreciated. 任何代码的帮助将不胜感激。 Dear down voters kindly post your comments before vote please . 亲爱的选民,请在投票前发表您的评论 Please allow me to rectify. 请允许我纠正。 Thanks for your co-operation. 谢谢你的合作。 Regards Biswajit 关于比斯瓦吉特

You missed a key point in the documentation (my emphasis): 您错过了文档中的关键点(我的重点):

(Optional) If you use an OnPageChangeListener with your view pager you should set it in the indicator rather than on the pager directly. (可选)如果将OnPageChangeListener与视图寻呼机一起使用,则应在指示器中设置它,而不是直接在寻呼机上设置它

I'll be a bit more specific. 我会更具体一些。 When you call ... 你打电话时 ...

this.mIndicator.setViewPager(viewPager); 

... the indicator sets itself as OnPageChangeListener to the given ViewPager , effectively overriding any already set listener. ...指标将自身设置为给定ViewPager OnPageChangeListener ,从而有效地覆盖任何已设置的侦听器。 That means that this listener you set up just before the indicator is useless: 这意味着您在指标无效之前设置的该侦听器无效:

 this.viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
                        super.onPageSelected(position);
                        if (position == 0) {
                            menu.removeIgnoredView(viewPager);
                        } else {
                            menu.addIgnoredView(viewPager);
                        }
                    }
                });

As the documentation states, you should set the listener to the indicator instead (it will basically proxy the events). 如文档所述,您应该将侦听器设置为指示器(它基本上将代理事件)。 So change your code to: 因此,将您的代码更改为:

mIndicator.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { ... });

If you use a recent version of ViewPager , you'll see that its setOnPageChangeListener() method is actually deprecated in favour of addOnPageChangeListener() . 如果您使用的是ViewPager的最新版本,则会看到实际上不赞成使用它的setOnPageChangeListener()方法,而推荐使用addOnPageChangeListener() The latter obviously supports attaching more than a single listener to the pager. 后者显然支持在寻呼机上附加多个侦听器。

The last time I checked the ViewPager source code, the set and add methods worked independently from each other. 我上次检查ViewPager源代码时, setadd方法彼此独立工作。 As such, you may also be able to get away with: 因此,您也许还可以摆脱:

this.viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { ... });

That wouldn't be my first choice though. 那不是我的第一选择。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM