如何从EditText替换特定单词

时间:2018-07-04 07:20:31

标签: android android-edittext android-textinputedittext

我有一个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中写这样的东西:

  

https://wwww.mysite.com/https://wwww.mysite.com/helloworld

  

https://wwww.mysite.com/wwww.mysite.com/helloworld

  

https://wwww.mysite.com/wwww.anyothersite.com/helloworld

它将自动将其转换为正确的格式,如下所示:

  

https://wwww.mysite.com/helloworld

我该如何实现?

10 个答案:

答案 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/之后)编辑文本。

所以您应该按照以下步骤

  1. 将基本URL前缀为EditText,并使其不可编辑
  2. 让用户输入网址的子部分
  3. 使用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");