本人第一次写博客,写作不怎么好,而且不是大牛。为了记录遇到的问题和解决的方法,供自己遇到有个好的解决方案。
最近公司做一个直播APP,使用了第三方ucloud和环信,鉴于别的比较热门的直播应用。在直播和观看直播,点击EditText弹出软键盘之后,EditText无故消失。
于是排查问题,定位了到UVideoView和EditText抢焦点。然后各种上网找资料,弄了好久没弄好。
于是使用了PopWindow帮我解决了问题。
这里写代码片
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/transparent"
android:orientation="vertical"
android:layout_above="@+id/container_send" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/half_white_transparent"
android:padding="8dp">
<RelativeLayout
android:id="@+id/switch_rl"
android:layout_width="70dp"
android:layout_height="38dp"
android:background="@drawable/select_barrage">
<TextView
android:id="@+id/switch_tv"
android:layout_width="wrap_content"
android:layout_height="38dp"
android:background="@drawable/route_white_bg_4"
android:gravity="center"
android:paddingLeft="5dp"
android:paddingRight="15dp"
android:text="弹幕"
android:textColor="@color/pink2red"
android:textSize="12sp" />
</RelativeLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="38dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:background="@drawable/route_white_bg_4"
android:gravity="center">
<EditText
android:id="@+id/input_barrage_et"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/transparent"
android:hint="@string/hint_talk_with_fans"
android:inputType="text"
android:maxLength="20"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textColor="@color/text_black_color"
android:textColorHint="@color/text_black_hint_color"
android:textSize="@dimen/xsmall_txt" />
</LinearLayout>
<TextView
android:id="@+id/send_tv"
android:layout_width="wrap_content"
android:layout_height="38dp"
android:background="@drawable/route_red_bg_4"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="发送"
android:textColor="@color/white2gray"
android:textSize="@dimen/xsmall_txt" />
</LinearLayout>
</LinearLayout>
/**
* 自定义PopWindow
* Created by macbook
*/
public class InputPopWindow extends PopupWindow implements View.OnClickListener{
/**
* 上下文
*/
private Context mContext;
/**
* 弹幕开关
*/
private TextView switchTv;
/**
* 弹幕布局
*/
private RelativeLayout switchRl;
/**
* 内容编辑框
*/
private EditText inputEt;
/**
* 发送
*/
private TextView sendTv;
private boolean isBarrageShow = false;
private MessageViewListener messageViewListener;
public void setMessageViewListener(MessageViewListener messageViewListener) {
this.messageViewListener = messageViewListener;
}
public InputPopWindow(Context context){
this.mContext = context;
initView();
}
private void initView(){
View v = LayoutInflater.from(mContext).inflate(R.layout.fragment_chat_input, null);
switchTv = (TextView) v.findViewById(R.id.switch_tv);
switchTv.setOnClickListener(this);
switchRl = (RelativeLayout) v.findViewById(R.id.switch_rl);
switchRl.setOnClickListener(this);
inputEt = (EditText) v.findViewById(R.id.input_barrage_et);
sendTv = (TextView) v.findViewById(R.id.send_tv);
sendTv.setOnClickListener(this);
this.setContentView(v);
ColorDrawable dw = new ColorDrawable(0xb0000000);
setBackgroundDrawable(dw);
setFocusable(true);
setOutsideTouchable(true);
this.setWidth(Utils.getScreenWidth());
this.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
}
public void showPopupWindow(View parent) {
if (this.isShowing()) {
this.dismiss();
return;
}
showInputMethodManager();
this.showAtLocation(parent, Gravity.BOTTOM, 0, 0);
}
private void showInputMethodManager(){
inputEt.setFocusable(true);
inputEt.setFocusableInTouchMode(true);
inputEt.requestFocus();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run(){
InputMethodManager inputManager = (InputMethodManager) inputEt.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(inputEt, 0);
}
},200);
}
@Override
public void dismiss() {
KeyboardUtils.hideSoftInput(inputEt);
super.dismiss();
inputEt.setText("");
if(messageViewListener != null){
messageViewListener.onHiderBottomBar();
}
}
public interface MessageViewListener {
void onMessageSend(String content,boolean isBarrage);
void onHiderBottomBar();
}
}
调用方法
private InputPopWindow inputPopWindow;
public void showInputPopWindow(Context context, View view,InputPopWindow.MessageViewListener messageViewListener){
if(inputPopWindow == null){
inputPopWindow = new InputPopWindow(context);
}
inputPopWindow.setMessageViewListener(messageViewListener);
inputPopWindow.showPopupWindow(view);
}