关闭

PopupWindow中EditText无法长按出现selection markers

标签: androidappjava应用手机
1500人阅读 评论(0) 收藏 举报
分类:

首先解释下selection markers,就是我们在edittext长按的时候,会出现选中的光标以及复制、粘贴等选项(如下图);实在找不到描述他们的词语了,就用了so上的名称了;


就在昨天,跑了跑项目,想再看看还有什么可以优化的地方,于是发现了有些地方的TextView没有做长按复制,然后就优化了下。优化完成后想试试能不能粘贴,于是找了个项目里的EditText长按复制,但是!!太奇怪了,项目中的其他EditText长按后都会出现粘贴的选项,但是在PopupWindow中的某一个EditText死活出不来。我一开始以为是没有获取焦点,重写了EditText让他一直强制获取焦点还是没用;出问题的EditText如下图所示



查找问题的过程就不详述了,总之结果就是google不支持popupwindow中edittext长按显示selection markers,详细解释请见链接

https://code.google.com/p/android/issues/detail?id=62508

虽然popupwindow + edittext的方案的确是技术无法解决,但是,Google推荐我们使用DialogFragment来实现弹窗效果。ok~没问题,下面我们就来说说如何改造这个界面:

首先,新建一个类继承自DialogFragment:

public class ReplyDialogFragment extends DialogFragment {
    private Context mContext;

    public ReplyDialogFragment() {

    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mContext = activity;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.dialog_fragment);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题
        View view = inflater.inflate(R.layout.dialog_liveroom_reply, container);
        return view;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
    }
}

DIalogFragment其实就是相当于AlertDialog,但是大家看到我之前的那个弹出框的宽度是满屏的,但是AlertDialog默认情况的主题设置一个背景,背景是一个带阴影的可以拉伸的.9格式的图片,因为图片有留白,所以我们看到的alertDiaolog怎么设置布局文件都不能变为全屏的了。

那么我们就需要自定义一个主题文件给他设置上去,就是OnCreate()中的方法

setStyle(DialogFragment.STYLE_NORMAL, R.style.dialog_fragment);

dialog_fragment.xml

    <style name="dialog_fragment">
        <item name="android:windowBackground">@android:drawable/screen_background_light_transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@style/AnimationDialogFragment</item>
    </style>

    <!-- dialogfragment出现消失动画 -->
    <style name="AnimationDialogFragment" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@anim/fadein_from</item>
        <item name="android:windowExitAnimation">@anim/fadeout_to</item>
    </style>
上面的style设置了dialog的背景为透明的,并且增加一个出场和退场的动画。

到了这里我们已经成功了一大半了,但是博主在写完上述代码后又出现了一个问题。大家可能看到了,我之前弹窗里的EditText高度是一个固定的高度,问题来了:打开dialog后,在输入状态下,我们的软键盘并未将整个dialog弹上去,而是仅仅弹到我们EditText中光标所在的水平位置,如下图所示:



这可不是我想要的效果啊 太丑啦!那么我们如何才能将整个Dialog弹上去呢,我们只需要在我们dialog的布局文件中加一个ScrollView就可以了,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#99000000"
    >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ScrollView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="?attr/default_bg"
        android:paddingBottom="12dp"
        android:paddingLeft="10dp"
        android:paddingRight="8dp"
        android:paddingTop="8dp">

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:background="?attr/xml_btn_nothing2grey_sel"
            android:padding="6dp"
            android:text="取消"
            android:textColor="?attr/text_black"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv_reply"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:padding="4dp"
            android:text="回复@xxx"
            android:textColor="?attr/text_black"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/tv_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:background="?attr/xml_btn_nothing2grey_sel"
            android:padding="6dp"
            android:text="发送"
            android:textColor="?attr/text_btn_red"
            android:textSize="14sp" />

        <EditText
            android:id="@+id/et_content"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_below="@+id/tv_reply"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="8dp"
            android:layout_weight="1"
            android:background="?attr/bg_edittext_focused"
            android:gravity="top|left"
            android:hint="我也来说两句.."
            android:maxLength="200"
            android:maxLines="6"
            android:paddingBottom="8dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:paddingTop="8dp"
            android:textColor="?attr/text_black"
            android:textColorHint="?attr/text_grey"
            android:textSize="15sp" />


    </RelativeLayout>

</RelativeLayout>

其中的ScrollView是重点,加入了这个我们的整个功能就算完成了!不过还有第二种方法:不想添加ScrollView的朋友在onCreateView中添加如下也是可以的

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);


最后再加上弹出DialogFragment的代码:

ReplyDialogFragment replyDialog = new ReplyDialogFragment();
replyDialog.show(((MainActivity) mContext).getSupportFragmentManager(), "tag");

最后效果图:


做这个用了整整一个下午,虽然界面看上去没有任何的区别,但是用户的体验在某些情况下会提高很多的(万一想粘贴下呢?哈哈~)

总结下学习到了的知识:首先是解决了本博客所提出问题;了解到了AlertDialog如何全屏;DialogFragment的基本使用;软键盘如何将整个View弹上去;如何自定义样式;


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:84501次
    • 积分:985
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:9篇
    • 译文:0篇
    • 评论:103条
    文章分类
    最新评论