操作栏主页按钮不起作用嵌套preferenceScreen [英] Action Bar Home Button not functional with nested PreferenceScreen

查看:247
本文介绍了操作栏主页按钮不起作用嵌套preferenceScreen的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了一个解决办法,以实际启用嵌套preferenceScreen的动作条主页按钮......但它不叫OnOptionsItemSelected在我的preferenceActivity。任何人都知道的方式实际使用上嵌套preferenceScreen home键?

修改后35这里的:

<一个href="http://$c$c.google.com/p/android/issues/detail?id=4611">http://$c$c.google.com/p/android/issues/detail?id=4611

  @覆盖
    在preferenceTreeClick公共布尔(preferenceScreen preferenceScreen,preference preference)
    {
        super.on preferenceTreeClick(preferenceScreen,preference);
        如果(preference!= NULL)
            如果(preference的instanceof preferenceScreen)
                如果(((preferenceScreen)preference).getDialog()!= NULL)
                    ((preferenceScreen)preference).getDialog()getActionBar()setHomeButtonEnabled(真)。
        返回false;
    }
 

解决方案

我有这个问题,最近,这是我如何解决它。首先访问preferenceScreen我用你上面提到的完全相同的方法。

  @覆盖
在preferenceTreeClick公共布尔(preferenceScreen preferenceScreen,preference preference){
    super.on preferenceTreeClick(preferenceScreen,preference);

    //如果用户点击一个preference屏幕上,设置了操作栏
    如果(preference的instanceof preferenceScreen){
        initializeActionBar((preferenceScreen)preference);
    }

    返回false;
}
 

在这里,我看着什么<一个href="https://github.com/android/platform_frameworks_base/blob/master/core/java/android/$p$pference/$p$pferenceScreen.java"相对=nofollow> preferenceScreen 是的,我伤心地发现它仅仅是包装一个对话框。展望未来,我然后设置动作条的显示选项,并试图找到家按钮区域。这不幸的是不是太容易得到,但与层次观众的帮助下,我设法获得通过找到家图标,然后它的父视图。一旦我们有机会获得包含的LinearLayout,我们可以将一个onClickListener,我们驳回preferenceScreen的对话框中,它调用<一href="https://github.com/android/platform_frameworks_base/blob/master/core/java/android/$p$pference/$p$pferenceScreen.java#L192"相对=nofollow> preferenceScreen的onDismissListener 并把我们带回到了previous屏幕。

  / **设置了一个操作栏{@link preferenceScreen} * /
公共静态无效initializeActionBar(preferenceScreen preferenceScreen){
    最后一个对话框对话框= preferenceScreen.getDialog();

    如果(对话!= NULL){
        // Inialize操作栏
        dialog.getActionBar()setDisplayHomeAsUpEnabled(真)。

        //应用自定义主页按钮区点击监听器关闭preferenceScreen因为preferenceScreens是对话而吞
        //事件,而不是传递到活动
        //相关问题如下:https://$c$c.google.com/p/android/issues/detail ID = 4611
        查看homeBtn = dialog.findViewById(android.R.id.home);

        如果(homeBtn!= NULL){
            OnClickListener dismissDialogClickListener =新OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    dialog.dismiss();
                }
            };

            // prepare自己的一些哈克编程
            ViewParent homeBtnContainer = homeBtn.getParent();

            // home键是的FrameLayout内的ImageView的
            如果(homeBtnContainer的instanceof的FrameLayout){
                ViewGroup中containerParent =(ViewGroup中)homeBtnContainer.getParent();

                如果(containerParent的instanceof的LinearLayout){
                    //这个视图还包含标题文本,集全视图点击
                    ((的LinearLayout)containerParent).setOnClickListener(dismissDialogClickListener);
                } 其他 {
                    //刚上home键设置
                    ((的FrameLayout)homeBtnContainer).setOnClickListener(dismissDialogClickListener);
                }
            } 其他 {
                //该如果一切都失败了默认情况下,
                homeBtn.setOnClickListener(dismissDialogClickListener);
            }
        }
    }
}
 

I found a workaround to actually enable the ActionBar home button on the nested PreferenceScreen... however it doesn't call OnOptionsItemSelected in my PreferenceActivity. Anyone know a way to actually use the home button on a nested PreferenceScreen?

Modification of post 35 here:

http://code.google.com/p/android/issues/detail?id=4611

@Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
    {
        super.onPreferenceTreeClick(preferenceScreen, preference);
        if (preference!=null)
            if (preference instanceof PreferenceScreen)
                if (((PreferenceScreen)preference).getDialog()!=null)
                    ((PreferenceScreen)preference).getDialog().getActionBar().setHomeButtonEnabled(true);
        return false;
    }

解决方案

I had this problem recently and this is how I solved it. Firstly to access the PreferenceScreen I use the exact same method you mentioned above.

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);

    // If the user has clicked on a preference screen, set up the action bar
    if (preference instanceof PreferenceScreen) {
        initializeActionBar((PreferenceScreen) preference);
    }

    return false;
}

From here I looked into what a PreferenceScreen is, and I was saddened to find out it is just wrapper of a Dialog. Moving forward, I then set the actionbar display options and attempt find the home button area. This unfortunately wasn't too easy to get, but with the help of the hierarchy viewer I managed to gain access by finding the home icon and then its parent views. Once we have access to the containing LinearLayout, we can attach an onClickListener where we dismiss the PreferenceScreen's dialog, which calls PreferenceScreen's onDismissListener and returns us to the previous screen.

/** Sets up the action bar for an {@link PreferenceScreen} */
public static void initializeActionBar(PreferenceScreen preferenceScreen) {
    final Dialog dialog = preferenceScreen.getDialog();

    if (dialog != null) {
        // Inialize the action bar
        dialog.getActionBar().setDisplayHomeAsUpEnabled(true);

        // Apply custom home button area click listener to close the PreferenceScreen because PreferenceScreens are dialogs which swallow
        // events instead of passing to the activity
        // Related Issue: https://code.google.com/p/android/issues/detail?id=4611
        View homeBtn = dialog.findViewById(android.R.id.home);

        if (homeBtn != null) {
            OnClickListener dismissDialogClickListener = new OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            };

            // Prepare yourselves for some hacky programming
            ViewParent homeBtnContainer = homeBtn.getParent();

            // The home button is an ImageView inside a FrameLayout
            if (homeBtnContainer instanceof FrameLayout) {
                ViewGroup containerParent = (ViewGroup) homeBtnContainer.getParent();

                if (containerParent instanceof LinearLayout) {
                    // This view also contains the title text, set the whole view as clickable
                    ((LinearLayout) containerParent).setOnClickListener(dismissDialogClickListener);
                } else {
                    // Just set it on the home button
                    ((FrameLayout) homeBtnContainer).setOnClickListener(dismissDialogClickListener);
                }
            } else {
                // The 'If all else fails' default case
                homeBtn.setOnClickListener(dismissDialogClickListener);
            }
        }    
    }
}

这篇关于操作栏主页按钮不起作用嵌套preferenceScreen的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆