Android中Google Docs的Office或function等不同字号如何显示
How to display words of different sizes, such as Office or function of Google Docs in Android
我尝试做像office或者Google文档可以输入不同字号这个功能
这是我的代码
input =(EditText)findViewById(R.id.Input_EditText);
input.addTextChangedListener(new TextWatcher()
{
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s)
{
int index = input.getSelectionEnd();
String nowstr;
if(index==0)
{
//do nothing
}
else
{
nowstr = s.toString();
char nowstr_array[] = nowstr.toCharArray();
show_input = String.valueOf(nowstr_array[index-1]);
SpannableStringBuilder spann = new SpannableStringBuilder(show_input);
AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40,true);
spann.setSpan(word_size, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
input.getText().insert(index, spann);
}
}
});
但是这个程序会崩溃...
那我试试
Toast.makeText(MainActivity.this, spann, Toast.LENGTH_SHORT).show();
//input.getText().insert(index, spann);
但是这样做可以显示...
这是为什么?
因为在 aftertextchanged 方法中你得到文本并改变文本大小,最后你将文本插入到 edittext 中,但是该方法将导致 textWatcher 侦听器然后将 运行 aftertextchanged 并且在这个方法中你也改变文本所以这是一个死循环,但是如果你使用吐司,它不会插入文本然后不会引起听众,那么它就可以工作了:)
首先屏幕显示如下
Word会再次出现小字和大字,此时不是我想要的,我只想要一个足够大的
然后我按删除键,程序会崩溃
这是我的代码:
SpannableStringBuilder spann = new SpannableStringBuilder(show_input);
spann.setSpan(new AbsoluteSizeSpan(40,true), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Toast.makeText(MainActivity.this, Integer.toString(index), Toast.LENGTH_SHORT).show();
input.removeTextChangedListener(this) ;
input.getText().insert(index, spann);
input.addTextChangedListener(this) ;
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
beforeText = s.toString() ;
}
public void afterTextChanged(Editable s) {
int index = input.getSelectionEnd();
String nowstr;
if (index == 0) {
// do nothing
} else {
if (beforeText.length() < s.toString().length()) {
nowstr = s.toString();
char nowstr_array[] = nowstr.toCharArray();
String show_input = String.valueOf(nowstr_array[index - 1]);
SpannableStringBuilder spann = new SpannableStringBuilder(
show_input);
AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40, true);
spann.setSpan(word_size, 0, 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
input.removeTextChangedListener(this) ;
input.getText().replace(index-1, index, spann) ;
input.addTextChangedListener(this) ;
}
}
}
});
beforeText 是一个全局变量
我尝试做像office或者Google文档可以输入不同字号这个功能
这是我的代码
input =(EditText)findViewById(R.id.Input_EditText);
input.addTextChangedListener(new TextWatcher()
{
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s)
{
int index = input.getSelectionEnd();
String nowstr;
if(index==0)
{
//do nothing
}
else
{
nowstr = s.toString();
char nowstr_array[] = nowstr.toCharArray();
show_input = String.valueOf(nowstr_array[index-1]);
SpannableStringBuilder spann = new SpannableStringBuilder(show_input);
AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40,true);
spann.setSpan(word_size, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
input.getText().insert(index, spann);
}
}
});
但是这个程序会崩溃...
那我试试
Toast.makeText(MainActivity.this, spann, Toast.LENGTH_SHORT).show();
//input.getText().insert(index, spann);
但是这样做可以显示...
这是为什么?
因为在 aftertextchanged 方法中你得到文本并改变文本大小,最后你将文本插入到 edittext 中,但是该方法将导致 textWatcher 侦听器然后将 运行 aftertextchanged 并且在这个方法中你也改变文本所以这是一个死循环,但是如果你使用吐司,它不会插入文本然后不会引起听众,那么它就可以工作了:)
首先屏幕显示如下
Word会再次出现小字和大字,此时不是我想要的,我只想要一个足够大的
然后我按删除键,程序会崩溃
这是我的代码:
SpannableStringBuilder spann = new SpannableStringBuilder(show_input);
spann.setSpan(new AbsoluteSizeSpan(40,true), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Toast.makeText(MainActivity.this, Integer.toString(index), Toast.LENGTH_SHORT).show();
input.removeTextChangedListener(this) ;
input.getText().insert(index, spann);
input.addTextChangedListener(this) ;
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
beforeText = s.toString() ;
}
public void afterTextChanged(Editable s) {
int index = input.getSelectionEnd();
String nowstr;
if (index == 0) {
// do nothing
} else {
if (beforeText.length() < s.toString().length()) {
nowstr = s.toString();
char nowstr_array[] = nowstr.toCharArray();
String show_input = String.valueOf(nowstr_array[index - 1]);
SpannableStringBuilder spann = new SpannableStringBuilder(
show_input);
AbsoluteSizeSpan word_size = new AbsoluteSizeSpan(40, true);
spann.setSpan(word_size, 0, 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
input.removeTextChangedListener(this) ;
input.getText().replace(index-1, index, spann) ;
input.addTextChangedListener(this) ;
}
}
}
});
beforeText 是一个全局变量