滑动菜单锁定上部视图上的触摸事件

时间:2012-12-15 18:55:01

标签: android menu android-viewpager slidingdrawer

我正在尝试在我的应用程序中使用Sliding Menu。在我的索尼Xperia S上它工作得非常好,但是当我尝试在HTC Desire HD上启动应用程序时,菜单会通过手势打开完美,但其他触摸事件被阻止并且顶视图(ViewPager,滑动菜单位于其后面)不滚动。

有人知道如何解决这个问题吗?

提供答案可能会有所帮助(这就是我使用菜单的方式):

private void initSlidingMenu()  
{       
    mSlidingMenu = new SlidingMenu(getApplicationContext());

    mSlidingMenu.setMode(SlidingMenu.LEFT);
    mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    mSlidingMenu.setShadowWidthRes(R.dimen.default_shadow_width);
    mSlidingMenu.setShadowDrawable(R.drawable.defaultshadow);
    mSlidingMenu.setBehindOffsetRes(R.dimen.default_behind_offset);
    mSlidingMenu.setFadeDegree(0.35f);
    mSlidingMenu.setMenu(firstPage);
    mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);    
}

onPageSelected()中,我禁用了菜单或启用它,因此菜单仅显示在左页:

@Override public void onPageSelected(int arg0)
{
    ActivityCompat.invalidateOptionsMenu(this);

    if (arg0 == Utils.DEFAULT_PAGE)

        mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);

    else

        mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}

1 个答案:

答案 0 :(得分:9)

我在运行ICS的三星Galaxy S2上运行滑动菜单时遇到了同样的问题,但运行姜饼的HTC Desire却没有。

我使用与您相同的方法来实现滑动菜单,但我发现另一个实现解决了这个问题。

而不是手动将菜单附加到您的活动:

mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);   

我选择通过SlidingMenu库中的一个Sliding活动扩展我的Activity。在我的情况下,我的活动最初是FragmentActivity,但我将其替换为SlidingFragmentActivity

然后你应该在onCreate方法中设置behindView,否则你的活动就会崩溃。

setBehindContentView(R.layout.slidingmenu); //Replace with the layout of your menu

它应该解决问题。

以下是我的活动的示例代码:

public class MainActivity extends SlidingFragmentActivity {

SlidingMenu menu;

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

    // Main view layout for the activity
    setContentView(R.layout.activity_listing); 

    // set the Behind View : REQUIRED (replace with your menu's layout)
    setBehindContentView(R.layout.slidingmenu);

    menu = getSlidingMenu();

    //Now you can customize your sliding menu if you want
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    menu.setShadowDrawable(R.drawable.slidingmenu_shadow);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    menu.setFadeDegree(0.35f);

您将注意到使用此解决方案,您无需致电

mSlidingMenu.setMenu(firstPage);
mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);

我没有分析SlidingMenu库的所有源代码,但在某些情况下,当前attachToActivity方法可能有问题,如果我们使用库提供的特殊活动,则不会出现这些错误。< / p>

编辑:对于那些使用SlidingMenu库和ActionBarSherlock(ABS)的人来说还可以。 首先,您必须确保在SlidingMenu lib中引用了ABS。这样,您就可以通过ABS扩展SlidingMenu提供的活动类。

示例如果我想将FragmentActivity与ABS和Sliding菜单一起使用: 你必须在滑动菜单库中进行更改

class SlidingFragmentActivity extends FragmentActivity implements SlidingActivityBase

通过

class SlidingFragmentActivity extends SherlockFragmentActivity implements SlidingActivityBase

然后在您的应用程序中,正常使用SlidingFragmentActivity

这是我的应用程序的代码,它就像我发布但支持ABS的那个:

public class MainActivity extends SlidingFragmentActivity {

ActionBar mActionBar;
SlidingMenu menu;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listing); //Layout of the above view

    /*
     * ABS initialization
     */
    mActionBar = getSupportActionBar();
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    mActionBar.setDisplayHomeAsUpEnabled(true);

    /*
     * Sliding menu initialization
     */
    menu = getSlidingMenu();
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    menu.setShadowDrawable(R.drawable.slidingmenu_shadow);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    menu.setFadeDegree(0.35f);

            /* This line initializes the way the sliding menu is working
            if you set the boolean to true, the ActionBar will slide along with the content.
            if you set to false, only the content will slide and the ActionBar will not move */
    setSlidingActionBarEnabled(true);

    // set the Behind View
    setBehindContentView(R.layout.slidingmenu); //Menu view