【问题标题】:Sliding menu locks touch event on upper view滑动菜单锁定上视图上的触摸事件
【发布时间】:2012-12-03 10:14:28
【问题描述】:

我正在尝试在我的应用程序中使用 Sliding Menu。在我的 Sony 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);
}

【问题讨论】:

    标签: android menu android-viewpager slidingdrawer


    【解决方案1】:

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

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

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

    mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);   
    

    我选择通过 SlidingMenu 库中的一项滑动活动来扩展我的活动。就我而言,我的 Activity 一开始是在扩展 FragmentActivity,但我将其替换为 SlidingFragmentActivity

    那么你应该在 onCreate 方法中设置 behindView 否则你的 Activity 会崩溃。

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

    它应该可以解决问题。

    这是我的 Activity 的示例代码:

    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 方法在某些情况下存在错误,如果我们使用库提供的特殊活动,这些错误不会出现。

    编辑: 好的,适合使用 SlidingMenu 库和 ActionBarSherlock (ABS) 的人。 首先,您必须确保在 SlidingMenu 库中引用了 ABS。这样,您就可以通过 ABS 扩展 SlidingMenu 提供的活动类。

    如果我想使用带有 ABS 和滑动菜单的 FragmentActivity 示例: 你必须在滑动菜单库中改变

    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
    

    【讨论】:

    • 好的,从 SlidingActivity 扩展效果很好,但有一件事我不能做:动作栏滑动内容。如何将其附加到菜单?我没有找到任何方法(例如 attachMode(int) )...
    • 在菜单自定义后尝试调用setSlidingActionBarEnabled(true);,它会滑动ActionBar。此设置的默认值为 false,这就是为什么只有内容幻灯片。
    • 如果解决方案对您有用,您能接受答案吗?
    • 很遗憾,我尝试了您的解决方案,但没有解决问题:操作栏不停留,它会随内容滑动
    • 您是在使用像 ActionBarSherlock 这样的库还是使用原生的 ActionBar ?如果您使用的是 ABS,我将更新我的代码,因为我也在使用它,一个简单的布尔值让我选择是否滑动 ActionBar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多