[android]How to implement an not editable scrollable EditText?(如何实现一个不可编辑的带滚动条的EditText?) .

本文介绍如何将Android中的EditText设置为只读状态,通过使用InputFilter阻止输入并设置滚动条实现垂直滚动。
 

要显示不可编辑的文字,最简单的方法当然是使用TextView,但有时出于某种原因,可能需要用EditText来显示文字,并且让其不可编辑。EditText本身是没有方法来设置使得其不可编辑的,但方法总是可以想出来的。

 

(1)setFilters

 

InputFilter用来对输入的文字进行过滤,需要实现一个方法:

public abstract CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend)

其中source代表你输入的文字,用键盘输入则为单个字符,start为0,end为1;粘帖时source为一串字符。

dest为现在显示的字符串,dstart,dend为光标所在字符串的位置。

 

下面的InputFilter为当输入任何字符时,替换为空字符(相当于不输入),如果按删除键时候,保持原来的字符,这时dstart退了一格,所以保持字符应该为dst.subSequence(dstart, dend)。代码如下:

 

  1. editText.setFilters(new InputFilter[] { new InputFilter() {  
  2.     public CharSequence filter(CharSequence src, int start, int end, Spanned dst, int dstart, int dend) {  
  3.         Log.d(TAG, "src=" + src + ";start=" + start + ";end=" + end);  
  4.         Log.d(TAG, "dst=" + dst + ";dstart=" + dstart + ";dend=" + dend);  
  5.         return src.length() < 1 ? dst.subSequence(dstart, dend) : "";  
  6.     }  
  7. } });  
  

 

 

(2)设置滚动条

 

在layout里面设置EditText的属性:

android:scrollbars="vertical"

 

这只是让垂直滚动条可见,要让其动起来,还得使用一个方法:

public final void setMovementMethod (MovementMethod movement)

 

可以直接使用简单的滚动方法,setMovementMethod(ScrollingMovementMethod.getInstance());

 

 

完整代码如下:

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <EditText    
  8.     android:id="@+id/edittext1"  
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="fill_parent"   
  11.     android:scrollbars="vertical"  
  12.     android:text="@string/hello"  
  13.     />  
  14. </LinearLayout>  

 

  1. package com.vani.android.jack;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.text.InputFilter;  
  6. import android.text.Spanned;  
  7. import android.text.method.ScrollingMovementMethod;  
  8. import android.util.Log;  
  9. import android.widget.EditText;  
  10.   
  11. public class UneditableEditText extends Activity {  
  12.     private static final String TAG = "UneditableEditText";  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.         EditText editText = (EditText) findViewById(R.id.edittext1);  
  20.         editText.setCursorVisible(false);  
  21.         editText.setMovementMethod(ScrollingMovementMethod.getInstance());  
  22.         editText.setFilters(new InputFilter[] { new InputFilter() {  
  23.             public CharSequence filter(CharSequence src, int start, int end, Spanned dst, int dstart, int dend) {  
  24.                 Log.d(TAG, "src=" + src + ";start=" + start + ";end=" + end);  
  25.                 Log.d(TAG, "dst=" + dst + ";dstart=" + dstart + ";dend=" + dend);  
  26.                 return src.length() < 1 ? dst.subSequence(dstart, dend) : "";  
  27.             }  
  28.         } });  
  29.     }  
  30. }  

### 如何在Android开源项目中应用.patch文件 当涉及到向Android开源项目(AOSP)应用补丁时,通常会遵循一系列特定的操作流程来确保更改被正确集成。对于AOSP而言,官方文档建议访问项目的官方网站并下载最新的源码版本[^1]。 #### 准备工作环境 为了能够顺利地应用`.patch`文件到AOSP环境中,首先需要设置好本地的工作空间: - 安装必要的工具链以及依赖库; - 初始化仓库并通过命令行克隆整个AOSP树结构至本地计算机上; #### 获取Patch文件 假设已经获取了一个或多个`.patch`文件,这些文件包含了想要应用于当前代码库中的修改内容。 #### 应用Patch文件 接下来,在终端窗口内导航到目标目录下执行如下操作以应用单个或批量的`.patch`文件: ```bash git apply path/to/yourfile.patch ``` 如果存在多个连续编号的补丁,则可以编写简单的脚本来自动化此过程。下面是一个Python脚本的例子用于依次处理一组名为`0001-*.patch`, `0002-*.patch`... 的补丁集: ```python import os from subprocess import call patches_dir = './path_to_patches' for patch_file in sorted(os.listdir(patches_dir)): if patch_file.endswith('.patch'): print(f'Applying {patch_file}') result = call(['git', 'apply', '--verbose', f'{patches_dir}/{patch_file}']) if result != 0: raise Exception('Failed to apply patch') print('All patches applied successfully.') ``` 上述方法适用于大多数情况下的简单修补程序的应用场景。然而需要注意的是,并不是所有的`.patch`都能无冲突地融入现有分支之中,因此可能还需要手动解决可能出现的各种合并冲突等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值