【问题标题】:jfeinstein10/slidingmenu, viewpager with CirclePageIndicator not workingjfeinstein10/slidingmenu,带有 CirclePageIndicator 的 viewpager 不工作
【发布时间】:2015-10-02 03:16:17
【问题描述】:

我遇到了一个奇怪的情况。我正在使用 Slidingmenu、viewpager 和 CirclePageIndicator。当前查看寻呼机和滑动菜单正在工作,但 CirclePageIndicator 并未指示确切的页面。任何想法为什么? 以下是带有屏幕截图的活动代码。 我的代码-

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();
    }

}

当我运行代码时,如果我也滑动到不同的页面,我发现 circlepageindicator 指示第一页。 这是短片。

通常应该是这样的。

任何代码帮助将不胜感激。亲爱的选民请在投票前发布您的 cmets。请允许我纠正。谢谢你的合作。 问候 比斯瓦吉特

【问题讨论】:

    标签: android android-viewpager slidingmenu viewpagerindicator


    【解决方案1】:

    你错过了documentation 中的一个关键点(我的重点):

    (可选)如果您在视图寻呼机中使用 OnPageChangeListener,您应该在指示器中设置它,而不是直接在寻呼机上。

    我会更具体一点。当你打电话时......

    this.mIndicator.setViewPager(viewPager); 
    

    ...指示器将自己设置为OnPageChangeListener 到给定的ViewPager,有效地覆盖任何已经设置的侦听器。这意味着您在指标之前设置的这个监听器是无用的:

     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.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { ... });
    

    如果您使用最新版本的ViewPager,您会发现它的setOnPageChangeListener() 方法实际上已被addOnPageChangeListener() 弃用。后者显然支持将多个侦听器附加到寻呼机。

    上次我检查ViewPager 源代码时,setadd 方法彼此独立工作。因此,您也可以逃脱:

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

    不过那不是我的第一选择。

    【讨论】:

    • 谢谢你,MH。谢谢你的时间。我会尽力让你知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多