3

我有一个edittext:edittextmysite。

现在我想提供默认文本,例如:“ https://www.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://www.mysite.com/https://www.mysite.com/helloworld

或者

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

或者

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

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

https://www.mysite.com/helloworld

我怎样才能做到这一点?

4

10 回答 10

4
@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());
    }
}
于 2018-07-09T12:04:41.373 回答
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());

            }
        });
于 2018-07-13T09:26:11.467 回答
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 之后输入字符串,如上所述。

谢谢

于 2018-07-10T10:33:04.827 回答
0

与其事后编辑文本,还有很多更好的方法可以实现这一点:

  • 将“ https://example.com/ ”放在编辑文本的左侧,然后如果确实需要,您可以在字符串中搜索 .com、www. 等,然后使用任何算法将其和它们封装的名称删除在网上很容易找到。然后连接字符串。

  • 在编辑文本中使用提示。

于 2018-07-07T19:00:43.950 回答
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());
                }

            }
        }
于 2018-07-14T13:35:34.943 回答
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());
    }
}
于 2018-07-09T11:06:40.003 回答
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;
}

在此代码中,我尝试了您的输入及其工作。

于 2018-07-13T07:08:37.793 回答
0

这不是一个优雅的解决方案,我建议您完全使用替代 UX 来完成您尝试做的事情,但是如果您真的想采用这种方式,请在 TextWatcher 中尝试以下代码,

final String baseString="https://wwww.mysite.com/";
 @Override
 public void afterTextChanged(Editable s) {
             if(!s.toString().contains(baseString)){
                editText.setText(baseString+s.toString());
                editText.setSelection(editText.length());
            }else {
                String regex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";

                Pattern pattern=Pattern.compile(regex);

                String subStr=s.toString().substring(baseString.length());
                Matcher matcher= pattern.matcher(subStr);

                if(matcher.matches()){
                    editText.setText(baseString+subStr.replaceAll(regex,""));
                    editText.setSelection(editText.length());
                }else if(subStr.contains("https:")){
                    editText.setText(baseString+subStr.replace("https:",""));
                    editText.setSelection(editText.length());
                }else if(subStr.contains("www.")){
                    editText.setText(baseString+subStr.replace("www.",""));
                    editText.setSelection(editText.length());
                }else if(subStr.contains(".")){
                    editText.setText(baseString+subStr.replaceAll("\\.",""));
                    editText.setSelection(editText.length());
                }else if(subStr.contains("//")){
                    editText.setText(baseString+subStr.replaceAll("//",""));
                    editText.setSelection(editText.length());
                }else if(subStr.contains(":")){
                    editText.setText(baseString+subStr.replaceAll(":",""));
                    editText.setSelection(editText.length());
                }

            }

}

一旦用户开始输入,它会在编辑文本中设置我们的基本字符串,并强制用户不要编写任何可以成为 uri 一部分的内容。当用户尝试按退格键时要考虑的一件重要事情是,这是使用特殊条件处理的,一旦他/她开始输入,用户将无法删除基本字符串。

注意:此解决方案也可以优化

于 2018-07-14T07:26:39.640 回答
0

您可以将其存储为字符串,而不仅仅是
String newReplacedString = stringtoReplace.replace("Phrase To Replace", "WHAT TO REPLACE WITH");

于 2018-07-10T22:56:45.480 回答
0

您应该修复EditText无法编辑的前缀文本,并且用户只能在 base-url 之后编辑文本(如 after https://wwww.mysite.com/)。

所以你应该按照这些步骤

  1. 将基本 url 前缀为 EditText 并使其不可编辑
  2. 让用户输入网址的子部分
  3. 使用有效 url 验证输入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
}
于 2018-07-09T11:47:54.473 回答