首先解释下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弹上去;如何自定义样式;
PopupWindow EditText长按问题与DialogFragment解决方案
当在PopupWindow中的EditText长按时,无法显示selection markers,即复制粘贴选项。原因是Google不支持此功能。为解决此问题,文章建议使用DialogFragment替代PopupWindow,并详细介绍了如何改造界面,包括自定义DialogFragment、处理软键盘弹起问题以及如何全屏显示AlertDialog。
1927

被折叠的 条评论
为什么被折叠?



