Android 如何让EditText不可编辑

显示多行的文本框,需要可以上下滚动,可复制内容,不可编辑。
使用TextView,可以实现上下滚动和不可编辑,没有办法实现复制内容的功能
于是决定使用EditText来实现。
在转到使用EditText时,碰到一个问题,因为默认EditText都有长按复制功能。可我的不行。
调查后发现,是因为这一句:

blockText.setMovementMethod(ScrollingMovementMethod.getInstance());

这一句用在TextView中,是使其可以上下滚动。EditText默认就是可以多行并且上下滚动。
去掉这一句,就可以恢复EditText的长按复制功能。
使用EditText要实现目标就要使其不可编辑,同时不要弹出软键盘。
在xml文件中可以轻松定义,**android:editable="false"**,可是我是动态生成的EditText,没有相应的set方法。
爬文一下,解决方案不少。
第一种:
设置EditText显示的文本后,调用setFocusable()方法,将参数设为false。
这种方案,没有办法进行复制操作。
第二种:
设置EditText显示的文本后,

复制代码

blockText.setFilters(new InputFilter[] { new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start,
        int end, Spanned dest, int dstart, int dend) {
            return source.length() < 1 ? dest.subSequence(dstart, dend) : "";
      }
} })

;
复制代码
效果很不错,不过点击文本框或长按会显示软键盘。
添加下面的代码:

复制代码

blockText.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        InputMethodManager manager = (InputMethodManager)context.getSystemService(INPUT_METHOD_SERVICE);
        manager.hideSoftInputFromWindow(blockText.getWindowToken(), 0);    
    }
});
blockText.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
    // TODO Auto-generated method stub
    InputMethodManager manager = (InputMethodManager)context.getSystemService(INPUT_METHOD_SERVICE);
    manager.hideSoftInputFromWindow(blockText.getWindowToken(), 0);    
    return false;
}

});
复制代码
没有效果,软键盘还在,不明白原因,是因为权限设定问题吗?
又试了下面的代码:

复制代码

blockText.setOnFocusChangeListener(new OnFocusChangeListener(){  
    @Override  
    public void onFocusChange(View v, boolean hasFocus) {  
        if (hasFocus==true) {
            Log.e("onFocusChange", "hasFocus==true");
            hideIM(v);  
           }  
      }  
});  

blockText.setOnTouchListener(new OnTouchListener(){  
    @Override  
    public boolean onTouch(View v, MotionEvent event) {  
        if(event.getAction()==MotionEvent.ACTION_DOWN) {
            Log.e("onTouch", "MotionEvent.ACTION_DOWN");
            hideIM(v);  
          }  
        return false;    // dispatch the event further!  
     }  
});  

private void hideIM(View edt) {
    // try to hide input_method:
    try {
        InputMethodManager im = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
        IBinder windowToken = edt.getWindowToken();
        if (windowToken != null) {
            // always de-activate IM
            Log.e("windowToken", "windowToken != null");
            im.hideSoftInputFromWindow(windowToken, 0);
           }
    } catch (Exception e) {
         Log.e("HideInputMethod", "failed:" + e.getMessage());
     }
}

复制代码
仍然没有效果。不明白为什么。
而且长按后,选择文字,在弹出的软键盘输入文字,虽然因为filter没有办法输入,不过选中的内容会被删掉!
第三种:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

在oncreate中设置,不要弹出软键盘,我把他放到上一种方法的设定软键盘的位置,不工作,我想应该是要在setContext之前吧。这里写代码片
可是因为还有其他文本框会用到软键盘,也就没有再去试。
第四种:
设置EditText显示的文本后,执行下面的方法,

blockText.setInputType(InputType.TYPE_NULL)

运行发现多行变成一行,

blockText.setSingleLine(false);

这样可以。不过长按还是会有有键盘出来。
第五种,最简单

blockText.setKeyListener(null);

与上面的方法效果相同。
一句就可以达到想要的效果,唯一的遗憾就是长按还是有软键盘弹出,而且复制选中内容无底色。
同样效果:

复制代码

blockText.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

   protected char[] getAcceptedChars() {
       return new char[] {};
    }
});

复制代码
如何长按不要打开软键盘?以及给选择内容加底色?
为什么设定关闭软键盘的语句没有作用呢?
==========================
其他:
android:windowSoftInputMode=”stateHidden” 程式一開始就不會自動顯示軟體鍵盤

1、EditText有焦点(focusable为true)阻止输入法弹出

复制代码

editText=(EditText)findViewById(R.id.txtBody);

        editText.setOnTouchListener(new OnTouchListener() {            

            public boolean onTouch(View v, MotionEvent event) {

                editText.setInputType(InputType.TYPE_NULL); // 关闭软键盘     

                return false;

            }

});

复制代码
2、当EidtText无焦点(focusable=false)时阻止输入法弹出

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);    
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
展开阅读全文

没有更多推荐了,返回首页