Android—EditText重新获取焦点后无法编辑

时间:2022-11-17 22:18:54
我有一个设置参数的fragment。想做成,当打开这个fragment的时候,里面的EnitText是不可编辑的(creat中代码设置)。点击这个EnitText或者一个按钮,这个EnitText变为可编辑状态。可却始终无法编辑。
各位前辈们帮帮看下,为什么。代码如下

public class SettingFragment extends Fragment {
EditText ip;
Button editIp;
SharedPreferences config;

@Override
public void onCreate(Bundle savedInstanceState) {
config = this.getActivity().getSharedPreferences("config", Context.MODE_PRIVATE);
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.common_setting_frag, container, false);
ip  = (EditText)view.findViewById(R.id.common_function_etSetIp);
editIp  = (Button) view.findViewById(R.id.common_function_btnSetIp);
String ipConfig = config.getString("ServerAddress", "");
if("".equals(ipConfig)){ 
ip.setHint("请输入服务器IP地址");
}else{
ip.setFocusable(false);
ip.setText(Regex.returnIp(ipConfig)[0]);
ip.setTextColor(this.getResources().getColor(R.color.gray));

}
editIp.setText("编辑");
ip.setOnClickListener(etListener);
editIp.setOnClickListener(btnListener);
return view;
}

@Override
public void onDestroy() {
super.onDestroy();
}

OnClickListener btnListener = new OnClickListener(){
public void onClick(View v) {
if(ip.isFocusable()){
String ipString = ip.getText().toString();
if(Regex.isIp(ipString)){
Editor editor = config.edit();
editor.putString("ServerAddress", "http://" + ipString + "/Czp/services/");
editor.commit();
ip.setFocusable(false);
ip.setTextColor(getResources().getColor(R.color.gray));
editIp.setText("编辑");
}else{
Toast.makeText(getActivity(), "IP输入格式不对", Toast.LENGTH_SHORT).show();
}
}else{
ip.setFocusable(true);
ip.setTextColor(getResources().getColor(R.color.black));
editIp.setText("保存");
}
}
};
OnClickListener etListener = new OnClickListener() {
public void onClick(View v) {
if(!ip.isFocusable()){
ip.setFocusable(true);
ip.setTextColor(getResources().getColor(R.color.black));
editIp.setText("保存");
}
}
};
}

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@drawable/background_common"
>
    
    
    
    <LinearLayout
android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
  <EditText
    android:id="@+id/common_function_etSetIp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
>
</EditText>

<Button
    android:id="@+id/common_function_btnSetIp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="4"
    style="@style/style_button"
/>   
</LinearLayout>
</LinearLayout>


我看过好几遍,逻辑上似乎并没有问题。可是就是无法编辑。

12 个解决方案

#1


我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑(获取焦点)时,点击button将其变为可编辑(改变样式),之后点击EditText弹出软键盘。

我在布局文件中给那个EditText设置了
android:focusable="false"
之后现在点击EnitText之后可以看到有光标在最前面闪烁,但是仍然不可编辑。
点击按钮干脆什么都没有。

#2


你试下设置enable为true

#3


用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

#4


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点


谢谢二位的帮忙,你们的办法我分别单独试了,也结合起来试了。都不可以的。

#5


ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行
 ip.setFocusable(true);
                ip.setTextColor(getResources().getColor(R.color.black));
                editIp.setText("保存");

#6


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行
 ip.setFocusable(true);
                ip.setTextColor(getResources().getColor(R.color.black));
                editIp.setText("保存");


唉,唉……就算设置setFocusable(true);也不管用!不过还是谢谢你了。

#7


引用 1 楼 zz5201314bb 的回复:
我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑。


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

我这个需求后来自己发现不太对,我改得更方便了。不过这个技术问题还是没有解决。


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行。

我后来把需求变了下,功能是实现了,但是这个技术问题还没解决。

#8


加上setFocusableInTouchMode(true); 就可以了。

引用 7 楼 zz5201314bb 的回复:
Quote: 引用 1 楼 zz5201314bb 的回复:

我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑。


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

我这个需求后来自己发现不太对,我改得更方便了。不过这个技术问题还是没有解决。


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行。

我后来把需求变了下,功能是实现了,但是这个技术问题还没解决。

#9


edit_sbumit.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
edit_sbumit.setFocusable(true);
edit_sbumit.setFocusableInTouchMode(true);
edit_sbumit.requestFocus();
edit_sbumit.requestFocusFromTouch();

}
});
给那个edit设置一个点击事件 然后按照步骤去申请焦点,一定要按照我那个代码的步骤

#10


我来终极解决方案:

     setFocusableInTouchMode(false||true)解决一切尴尬。

#11


楼上膜拜,一用就灵,想失去焦点就用 setFocusableInTouchMode(false),想重新获得就用setFocusableInTouchMode(true)! Android—EditText重新获取焦点后无法编辑

#12


后排友情提示:如果是Listview中出现了这样的问题请看下你的item是不是加了android:descendantFocusability

#1


我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑(获取焦点)时,点击button将其变为可编辑(改变样式),之后点击EditText弹出软键盘。

我在布局文件中给那个EditText设置了
android:focusable="false"
之后现在点击EnitText之后可以看到有光标在最前面闪烁,但是仍然不可编辑。
点击按钮干脆什么都没有。

#2


你试下设置enable为true

#3


用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

#4


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点


谢谢二位的帮忙,你们的办法我分别单独试了,也结合起来试了。都不可以的。

#5


ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行
 ip.setFocusable(true);
                ip.setTextColor(getResources().getColor(R.color.black));
                editIp.setText("保存");

#6


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行
 ip.setFocusable(true);
                ip.setTextColor(getResources().getColor(R.color.black));
                editIp.setText("保存");


唉,唉……就算设置setFocusable(true);也不管用!不过还是谢谢你了。

#7


引用 1 楼 zz5201314bb 的回复:
我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑。


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

我这个需求后来自己发现不太对,我改得更方便了。不过这个技术问题还是没有解决。


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行。

我后来把需求变了下,功能是实现了,但是这个技术问题还没解决。

#8


加上setFocusableInTouchMode(true); 就可以了。

引用 7 楼 zz5201314bb 的回复:
Quote: 引用 1 楼 zz5201314bb 的回复:

我希望:当点击不可编辑(获取焦点)的EnitText时,EditText可编辑,直接获取焦点,弹出软键盘;或者当EditText不可编辑。


引用 2 楼 rtyou1234 的回复:
你试下设置enable为true


引用 3 楼 drlyee 的回复:
用setFocusable(false)不成,要用requestFocus();
要请求焦点,而不是设置焦点

我这个需求后来自己发现不太对,我改得更方便了。不过这个技术问题还是没有解决。


引用 5 楼 jack_wolf_ 的回复:
ip.setFocusable(false);
无法获取焦点,如何能出发按钮单击事件
点击按钮应该执行。

我后来把需求变了下,功能是实现了,但是这个技术问题还没解决。

#9


edit_sbumit.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
edit_sbumit.setFocusable(true);
edit_sbumit.setFocusableInTouchMode(true);
edit_sbumit.requestFocus();
edit_sbumit.requestFocusFromTouch();

}
});
给那个edit设置一个点击事件 然后按照步骤去申请焦点,一定要按照我那个代码的步骤

#10


我来终极解决方案:

     setFocusableInTouchMode(false||true)解决一切尴尬。

#11


楼上膜拜,一用就灵,想失去焦点就用 setFocusableInTouchMode(false),想重新获得就用setFocusableInTouchMode(true)! Android—EditText重新获取焦点后无法编辑

#12


后排友情提示:如果是Listview中出现了这样的问题请看下你的item是不是加了android:descendantFocusability