我有一个edittext:edittextmysite。
现在,我想提供默认文本,例如:“ https://wwww.mysite.com/”
我实现了以下目标:
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
edittextmysite.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
});
因此,如果有人输入文本,它将自动附加到默认值,例如:https://wwww.mysite.com/<Mytext>
现在我想要的是如果有人在edittext中写这样的东西:
或
或
它将自动将其转换为正确的格式,如下所示:
我该如何实现?
答案 0 :(得分:3)
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
String text = s.toString.subString(0, s.lastIndexOf("/"));
edittextmysite.setText(s.toString().replace(text, "https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
答案 1 :(得分:1)
这是我尝试过的。
private String str = "https://wwww.mysite.com/";
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
String s1 = s.toString();
String s2 = s1.substring(str.length());
if(s2.contains("/")) {
String s3 = s1.substring(str.length());
if (Patterns.WEB_URL.matcher(s3).matches()) {
// Valid url
edittextmysite.setText(s.toString().replace(s3, ""));
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
}
这段代码不允许您输入其他URL,并且用户只能按照上述说明在URL后输入字符串。
谢谢
答案 2 :(得分:1)
edittextmysite.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(edittextmysite.getText().toString().length() == 0)
edittextmysite.setText("https://wwww.mysite.com/" + s.toString());
else
edittextmysite.append(s.toString());
}
});
答案 3 :(得分:0)
除了在以后编辑文本外,还有许多更好的方法可以完成此操作:
在编辑文本的左侧放置“ https://example.com/”,然后,如果确实需要,您可以在字符串中搜索.com,www。等,并删除它以及它们封装的名称使用网络上容易找到的任何算法。然后连接字符串。
在编辑文本中使用提示。
答案 4 :(得分:0)
在这里,我分享了完整的工作示例。上面有解释。
public class MainActivity extends AppCompatActivity implements TextWatcher {
String BASE_URL = "https://wwww.mysite.com";
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*paste this editText --> https://wwww.mysite.com/https://wwww.mysite.com/helloworld <--*/
editText = findViewById(R.id.et);
editText.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = s.toString().trim();
editText.removeTextChangedListener(this);
if (text.length() > 0) {
if (!text.contains(BASE_URL)) {
String tempText = BASE_URL +"/"+ text;
editText.setText(tempText); //setting text here
proceed(tempText); //sending here for further test, if pasted the link
} else {
proceed(text);
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
private void proceed(String text) {
String newText="";
String firstHalf = text.substring(0,text.lastIndexOf('/'));
String secondHalf = text.substring(text.lastIndexOf('/',(text.length()-1)));
String[] words = firstHalf.split("/"); //Split the word from String
for (int i = 0; i < words.length; i++){ //Outer loop for Comparison
if (words[i] != null) {
for (int j = i + 1; j < words.length; j++){ //Inner loop for Comparison
if (words[i].equals(words[j])) //Checking for both strings are equal
words[j] = null; //Delete the duplicate words
}
}
}
//Displaying the String without duplicate words{
for (int k = 0; k < words.length; k++){
if (words[k] != null)
newText=newText+words[k];
}
StringBuffer formattedText = new StringBuffer((newText+secondHalf));
formattedText.insert(6,"//"); //length of https;//
editText.setText(formattedText);
//attaching textwatcher again
editText.addTextChangedListener(this);
//moving cusor pointer to the end point
editText.setSelection(editText.getText().toString().length());
}
}
答案 5 :(得分:0)
您应将前缀文本固定为EditText
,该文本不可编辑,并且用户只能在基本URL之后(例如https://wwww.mysite.com/
之后)编辑文本。
所以您应该按照以下步骤
Patterns.WEB_URL.matcher(inputUrl).matches()
验证输入是否有效。您可以在EditText的TextChange上或单击按钮时添加此验证。 下面是一个自定义EditText代码,您可以直接使用
public class UrlEditText extends AppCompatEditText {
float mLeftPadding = -1;
public UrlEditText(Context context) {
super(context);
}
public UrlEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UrlEditText(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
initPrefix();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
String prefix = (String) getTag();
canvas.drawText(prefix, mLeftPadding,
getLineBounds(0, null), getPaint());
}
private void initPrefix() {
if (mLeftPadding == -1) {
String prefix = (String) getTag();
float[] widths = new float[prefix.length()];
getPaint().getTextWidths(prefix, widths);
float textWidth = 0;
for (float w : widths) {
textWidth += w;
}
mLeftPadding = getCompoundPaddingLeft();
setPadding((int) (textWidth + mLeftPadding),
getPaddingRight(), getPaddingTop(),
getPaddingBottom());
}
}
}
在布局xml文件中,就像
<com.path_of_custom_view.UrlEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="https://wwww.mysite.com/"
android:text="helloworld" />
可以使用此编辑文本定义自定义属性,而不是使用android:tag
。
对于输入验证,您可以像这样验证
String enteredUrl = textField.getText().toString();
if (Patterns.WEB_URL.matcher(enteredUrl).matches()) {
// Valid url
} else {
// Invalid url
}
答案 6 :(得分:0)
这对我有用,我希望这对您也有用。
@Override
public void afterTextChanged(Editable s) {
String text = edittextmysite.getText().toString();
String URL = "https://www.example.com/";
if (text.contains(URL)) {
String url = getUrl(URL, text);
if (!text.equals(url)) {
edittextmysite.setText(url);
edittextmysite.setSelection(url.length());
}
} else {
String tempUrl = URL + text;
String url = getUrl(URL, tempUrl);
if (!tempUrl.equals(url)) {
edittextmysite.setText(url);
edittextmysite.setSelection(url.length());
} else if (!text.contains(URL)) {
edittextmysite.setText(URL);
edittextmysite.setSelection(URL.length());
}
}
}
private String getUrl(String URL, String text) {
String urls[] = text.split("(?<!/)/(?!/)");
Log.v(TAG, Arrays.toString(urls));
String lastWord = urls[urls.length - 1];
String lastChar = text.substring(text.length() - 1);
if (lastChar.equals("/"))
lastWord = lastWord.concat(lastChar);
for (String url : urls) {
url = url.concat("/");
if (Patterns.WEB_URL.matcher(url).matches()) {
if (url.equals(URL)) {
if (!lastWord.contains("/"))
return url + lastWord;
else return text;
}
}
}
return URL;
}
在这段代码中,我尝试了您的输入及其工作。
答案 7 :(得分:0)
这不是一个很好的解决方案,我建议您将替代UX用于您要完全尝试的工作,但是如果您真的想采用这种方式,请在TextWatcher中尝试以下代码,
df1 <- read.table(text =
"last
'2017-08-21 9.49504'
'2017-08-22 9.53553'
'2017-08-23 9.52643'
'2017-08-24 9.53486'
'2017-08-25 9.53390'
'2017-08-28 9.48788'
'2017-08-29 9.44059'
'2017-08-30 9.49893'",
header = TRUE, stringsAsFactors = FALSE)
df2 <- read.table(text =
"last
'2017-08-21 11.58276'
'2017-08-22 11.58278'
'2017-08-23 11.58275'
'2017-08-24 11.58263'
'2017-08-25 11.58260'
'2017-08-29 11.58250'
'2017-08-30 11.58246'
'2017-08-31 11.58237'",
header = TRUE, stringsAsFactors = FALSE)
ll <- list(df1, df2)
names(ll) <- c('0P00012DY5', '0P0000KY8J')
final String baseString="https://wwww.mysite.com/";
}
一旦用户开始输入,它将在edittext中设置我们的基本字符串并强制 用户不要写任何可能属于uri的内容。当用户尝试按退格键时要考虑的一件事,是要使用特殊条件,并且一旦开始输入,用户将无法删除基本字符串。
注意:此解决方案也可以优化
答案 8 :(得分:0)
答案
您可以将edittext文本设置为不被用户删除。因此,预定义的文本将保留在ediitext中,并自动附加新文本。
尝试一下:
private EditText et;
private String str_value = "http://example.com/";
private String added_str;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = findViewById(R.id.edittext);
et.setText(str_value);
et.setSelection(str_value.length());
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(start == str_value.length() - 1)
{
et.setText(str_value);
et.setSelection(str_value.length());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
已编辑
如果要在用户输入编辑文本后取消域名。您可以尝试以下代码
@Override
public void afterTextChanged(Editable s) {
if(s.length() > str_value.length()) {
added_str = s.toString().substring(str_value.length(), s.length()); //this will get text after predefined text.
if(Patterns.DOMAIN_NAME.matcher(added_str).matches() || added_str.contains("http:"))
{
et.setText(str_value);
et.setSelection(str_value.length());
}
}
}
答案 9 :(得分:-1)
您可以将其存储为String而不是简单地
String newReplacedString = stringtoReplace.replace("Phrase To Replace", "WHAT TO REPLACE WITH");