Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何逐字在一个文本下面划线?_Java_Android_Textview_Underline_Android Spannable - Fatal编程技术网

Java 我如何逐字在一个文本下面划线?

Java 我如何逐字在一个文本下面划线?,java,android,textview,underline,android-spannable,Java,Android,Textview,Underline,Android Spannable,在android studio中,如何在句子中逐字划线?因此,我的程序将是这样的,如果我点击一个按钮,下划线将首先开始,当我再次点击按钮时,它将再次移动到下一个单词 例如: _The_ *** *** ***** **** *** **** ***. 因此,如果我想单击按钮,下划线将移动到它旁边的单词或3星号 The _***_ *** ***** **** *** **** ***. 然后再次单击下一个星号 The _***_ *** ***** **** *** **** ***. 这

在android studio中,如何在句子中逐字划线?因此,我的程序将是这样的,如果我点击一个按钮,下划线将首先开始,当我再次点击按钮时,它将再次移动到下一个单词

例如:

_The_ *** *** ***** **** *** **** ***.
因此,如果我想单击按钮,下划线将移动到它旁边的单词或3星号

The _***_ *** ***** **** *** **** ***.
然后再次单击下一个星号

The _***_ *** ***** **** *** **** ***.
这是我的代码,用于:

public class MainActivity extends AppCompatActivity {

Button btn;
TextView txt;
int counter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = findViewById(R.id.button);
    txt = findViewById(R.id.display);

    txt.setText("the red fox jumps over the lazy dog.");
    final String [] compare1 = txt.getText().toString().split("\\s");
    final String arr[] = txt.getText().toString().split(" ",2);
    final String fword = arr[0];
    String rword = arr[1];
    final String reprword = rword.replaceAll("[a-z]", "*");
    txt.setText(fword + " " + reprword);
    final String [] display = txt.getText().toString().split("\\s");
    /*final ArrayList<String> getters = new ArrayList<String>(Arrays.asList(display));*/

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(counter <= display.length) {
                if(compare1[counter].length() == display[counter].length())
                {
                    txt.setText(formatText(fword + " " + reprword,display[counter]));
                }

                counter++;
            }
            else
            {


            }
        }
    });
}
public CharSequence formatText(String base, String highlight) {
    int start = base.indexOf(highlight);
    if (start >= 0) {
        SpannableString span = new SpannableString(base);
        span.setSpan(new UnderlineSpan(), start, start + highlight.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return span;
    }
    return base;
}
}
public类MainActivity扩展了AppCompatActivity{
按钮btn;
文本视图;
整数计数器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.按钮);
txt=findViewById(R.id.display);
setText(“红狐跳过懒狗”);
最后一个字符串[]compare1=txt.getText().toString().split(“\\s”);
最终字符串arr[]=txt.getText().toString().split(“,2”);
最终字符串fword=arr[0];
字符串rword=arr[1];
最终字符串reprword=rword.replaceAll(“[a-z]”,“*”);
txt.setText(fword+“”+reprword);
最终字符串[]display=txt.getText().toString().split(“\\s”);
/*final ArrayList getters=新的ArrayList(Arrays.asList(display))*/
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(计数器=0){
SpannableString span=新的SpannableString(底座);
span.setSpan(新下划线span(),开始,开始+高亮显示.length(),span.span_EXCLUSIVE_EXCLUSIVE);
返回跨度;
}
返回基地;
}
}
我更改了句子的另一半以测试它是否正确。

base.indexOf(highlight)
==>
indexOf()
返回第一次出现在base中的highlight,这就是下划线范围跳到第一个“the”而不是下一次出现的原因。您可以使用
indexOf(String str,int fromIndex)
。 下面的代码跟踪变量“nextStartIndex”中的“fromIndex”,并且在完成句子后,下划线重置为第一个单词

public class UnderlineWordsActivity extends AppCompatActivity {

    private Button btn;
    private TextView txt;
    private int counter=0;
    private int nextStartIndex=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.button);
        txt = findViewById(R.id.display);
        txt.setText("the red fox jumps over the lazy dog.");

        final String[] arr = txt.getText().toString().split(" ", 2);
        final String firstWord = arr[0];
        String remainingWords = arr[1];
        final String reprword = remainingWords.replaceAll("[a-z]", "*");
        String text = firstWord+" "+reprword;
        txt.setText(text);

        final String[] display = txt.getText().toString().split("\\s");


       btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (counter >= display.length) {
                    counter = 0;
                    nextStartIndex = 0;
                }
                txt.setText(formatText(text, display[counter]));
                counter++;
            }
        });
    }

    public CharSequence formatText(String base, String highlight) {
        int start = base.indexOf(highlight,nextStartIndex);
        nextStartIndex = start+highlight.length();
        if (start >= 0) {
            SpannableString span = new SpannableString(base);
            span.setSpan(new UnderlineSpan(), start, nextStartIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            return span;
        }
        return base;
    }
}

老兄,我怎么能倒过来呢?你需要计数器-1和nextStartIndex-1,而不是将计数器和nextStartIndex重置为0