使用SlidingActivityBase和SherlockFragmentActivity创建滑动菜单

时间:2013-10-13 14:35:48

标签: android actionbarsherlock slidingmenu

我一直在按照本教程创建一个滑动菜单:

http://www.youtube.com/watch?v=LWTYQ2g597o

因为我使用Sherlock,我不得不改变我的课堂声明:

public class BaseActivity extends SlidingFragmentActivity 

以下内容:

public class RggarbActionBar extends SherlockFragmentActivity implements SlidingActivityBase 

现在我每次使用getSlidingMenu()方法时都会得到一个NullPointerException,该方法在我的类中保持空白并返回null。

这是我的全班:

public class RggarbActionBar extends SherlockFragmentActivity implements SlidingActivityBase  {
    protected ListFragment listFragment;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        listFragment = new RggarbSlidingMenu();
        SlidingMenu slidingMenu = getSlidingMenu();
        slidingMenu.setShadowWidth(15);//outsource these
        slidingMenu.setBehindOffset(60);
        slidingMenu.setFadeDegree(0.35f);
        slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        MenuInflater inflater = getSupportMenuInflater();
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        ActionBar actionBar = getSherlock().getActionBar();
        actionBar.setBackgroundDrawable(new 
                   ColorDrawable(Color.parseColor("#680e96")));
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setIcon(R.drawable.logo_icon);
        inflater.inflate(R.menu.action_bar_items, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if(itemId == android.R.id.home) {
            toggle();
            return true;
        }
        else if (itemId == R.id.abFeed) {
            Intent feed = new Intent(this, Home.class);
            startActivity(feed);
            return true;
        } else if (itemId == R.id.abNotifications) {
            Intent notifications = new Intent(this, Notifications.class);
            startActivity(notifications);
            return true;
        } else if (itemId == R.id.abAddNewItem) {
            Intent addNewItem = new Intent(this, ItemAdd.class);
            startActivity(addNewItem);
            return true;
        } else if (itemId == R.id.abSearch) {
            Intent search = new Intent(this, SearchItems.class);
            startActivity(search);
            return true;
        } else {
            return onOptionsItemSelected(item); //watch out for this one. if any problems occur change to "return true"
        }
    }
    public class BasePagerAdapter extends FragmentPagerAdapter{
        private List<Fragment> mFragments = new ArrayList<Fragment>();
        private ViewPager mPager;

        public BasePagerAdapter(FragmentManager fm, ViewPager vp){
            super(fm);
            mPager = vp;
            mPager.setAdapter(this);
            for (int i = 0; i < 3; i++){
                addTab(new RggarbSlidingMenu());
            }
        }

        public void addTab(Fragment frag){
            mFragments.add(frag);
        }

        @Override
        public Fragment getItem(int position){
            return mFragments.get(position);
        }

        @Override
        public int getCount(){
            return mFragments.size();
        }
    }
    @Override
    public void setBehindContentView(View view, LayoutParams layoutParams) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setBehindContentView(View view) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setBehindContentView(int layoutResID) {
        // TODO Auto-generated method stub

    }

    @Override
    public SlidingMenu getSlidingMenu() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void toggle() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showContent() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showMenu() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showSecondaryMenu() {
        // TODO Auto-generated method stub

    }

    @Override
    public void setSlidingActionBarEnabled(boolean slidingActionBarEnabled) {
        // TODO Auto-generated method stub

    }
}

1 个答案:

答案 0 :(得分:1)

您的代码是

@Override
public SlidingMenu getSlidingMenu() {
    // TODO Auto-generated method stub
    return null;
}

您将从此方法返回null。您应该添加代码以返回您应该在别处创建的slidemenu实例 (最有可能在您活动的OnCreate()方法中)。

如果你返回null,那就是你将得到的。

您最好在github页面上关注“Simple Example”,而不是实现SlidingActivityBase界面。

通过实现接口,您说要处理slidemenu系统的所有编码,并且不想使用内置代码。

实现一个接口(你正在做的)与扩展一个基类是完全不同的(你正在遵循的教程中解释了这一点)。

您的选择是:

  1. 忘记您找到的教程,因为它不适用于您并使用说明here手动实现滑动菜单。此方法不要求您扩展或实现任何内容,并且是更容易的选择。

  2. 您拥有ActionbarSherlockSlidingMenu的源代码。更改它,以便SlidingActivity扩展Sherlock Activity而不是标准Activity。

  3. 继续实现接口,但您必须编写所有已实现方法的代码。比起声音更容易,因为您可以基本上复制类 here 中的代码,并对类声明进行微调。

    public class SlidingActivity extends Activity implements SlidingActivityBase {
    

    更改为

    public class SherlockSlidingActivity extends SherlockFragmentActivity implements SlidingActivityBase {