multiline edittext where parts are not editable, like fill in the blanks

后端 未结 3 668
旧巷少年郎
旧巷少年郎 2020-12-31 23:07

I need to have a view which contains textview and edittext.

Example:

Yay! you made it to ______ We should hang out! feel ____ to follow me. 
         


        
3条回答
  •  情深已故
    2020-12-31 23:33

    multiline edittext where parts are not editable, like fill in the blanks

    You can use a TextWatcher() for this requirement

    Try this he is the little work around for this

    MainActivity

    public class MainActivity extends AppCompatActivity {
    
    
        EditText myEditText;
        String startText = "I'm The First Part";
        String lastText = "I'm The Last Part";
    
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final SpannableStringBuilder firstStringBuilder = new SpannableStringBuilder(startText);
            final SpannableStringBuilder lastStringBuilder = new SpannableStringBuilder(lastText);
    
            StyleSpan firstStyleSpan = new StyleSpan(android.graphics.Typeface.BOLD);
    
            firstStringBuilder.setSpan(firstStyleSpan, 0, firstStringBuilder.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            lastStringBuilder.setSpan(firstStyleSpan, 0, lastStringBuilder.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
    
            myEditText = findViewById(R.id.myEditText);
    
    
            spannableStringBuilder.append(firstStringBuilder);
            spannableStringBuilder.append("   ");
            spannableStringBuilder.append(lastStringBuilder);
    
            myEditText.setText(spannableStringBuilder);
            Selection.setSelection(myEditText.getText(), startText.length() + 1);
    
            myEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
    
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                                              int after) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                    if (!s.toString().startsWith(firstStringBuilder.toString())
                            || !s.toString().contains(lastText)) {
                        Log.e("StringBuilder_TAG", spannableStringBuilder.toString());
    
                        myEditText.setText(spannableStringBuilder);
                        Selection.setSelection(myEditText.getText(), myEditText.getText().length() - lastStringBuilder.length() - 1);
                    } else {
    
                        spannableStringBuilder.clear();
                        spannableStringBuilder.append(s.toString());
                        Log.e("My_TAG", spannableStringBuilder.toString());
    
                    }
    
                }
            });
    
        }
    
    
    }
    

    layout.activity_main

    
    
    
    
        
    
    
    
    

    Here is the output video of above code https://www.youtube.com/watch?v=pfhUzLiFD6U

    using above code you able to make not editble first and last parts of editext

    Note

    You can also use a TextDrawable here are some links for that

    • How to put text in a drawable?
    • https://github.com/amulyakhare/TextDrawable
    • Set unchangeable some part of editText android

    You can also create a custom EditText for this

    • Adding a prefix to an EditText

    You can also use InputFilter

提交回复
热议问题