我在AlertDialog中动态创建EditText,并希望限制显示的行数。目前,EditText会在每次回车时保持垂直扩展。这导致在某个点之后对话框按钮不可见。我已将代码分离到以下内容:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
EditText input = new EditText(v.getContext());
input.setLines(4);
//input.setMaxLines(4);
input.setSingleLine(false);
input.setGravity(Gravity.TOP);
//input.setVerticalScrollBarEnabled(true);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
});
AlertDialog d = builder.create();
d.show();
}
});
}
}
我也很高兴 a)限制文本行数OR b)滚动条出现在X行之外。
我已经尝试在EditText上设置了许多属性,包括'setMaxLines','setHeight'和'setVerticalScrollBarEnabled',这些属性都不起作用。
我意识到存在类似问题的一些现有建议,但没有一个是动态创建EditText并且在AlertDialog中。任何帮助或建议将不胜感激。
答案 0 :(得分:2)
如果您想设置固定行数,您应该
setLines(int numOfLines);
如果您想在输入时添加限制为行数
setMaxLines(int limit);
有关其他信息,您可以使用
将限制设置为最小行数setMinLines(int limit);
答案 1 :(得分:2)
您可以限制LimitedEditText组件中的行数
您可以限制LimitedEditText组件中的字符数
如果超过文本中间某处的字符或行的限制,则为光标 不会把你带到最后 - 它会留在你去过的地方。
我关闭了监听器,因为每次调用setText()方法都会递归调用这3个回调方法,以防用户超出字符或行限制。
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
/**
* EditText subclass created to enforce limit of the lines number in editable
* text field
*/
public class LimitedEditText extends EditText {
/**
* Max lines to be present in editable text field
*/
private int maxLines = 1;
/**
* Max characters to be present in editable text field
*/
private int maxCharacters = 50;
/**
* application context;
*/
private Context context;
public int getMaxCharacters() {
return maxCharacters;
}
public void setMaxCharacters(int maxCharacters) {
this.maxCharacters = maxCharacters;
}
@Override
public int getMaxLines() {
return maxLines;
}
@Override
public void setMaxLines(int maxLines) {
this.maxLines = maxLines;
}
public LimitedEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
public LimitedEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public LimitedEditText(Context context) {
super(context);
this.context = context;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
TextWatcher watcher = new TextWatcher() {
private String text;
private int beforeCursorPosition = 0;
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
//TODO sth
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
text = s.toString();
beforeCursorPosition = start;
}
@Override
public void afterTextChanged(Editable s) {
/* turning off listener */
removeTextChangedListener(this);
/* handling lines limit exceed */
if (LimitedEditText.this.getLineCount() > maxLines) {
LimitedEditText.this.setText(text);
LimitedEditText.this.setSelection(beforeCursorPosition);
}
/* handling character limit exceed */
if (s.toString().length() > maxCharacters) {
LimitedEditText.this.setText(text);
LimitedEditText.this.setSelection(beforeCursorPosition);
Toast.makeText(context, "text too long", Toast.LENGTH_SHORT)
.show();
}
/* turning on listener */
addTextChangedListener(this);
}
};
this.addTextChangedListener(watcher);
}
}
答案 2 :(得分:0)
与Darshan的回答一样,我最终扩展了EditText,实现了TextWatcher接口,并查看行数何时超过限制集。如果是,则恢复保存的光标位置/文本。请参阅以下代码:
public class MaxEditText extends EditText implements TextWatcher {
private String saved;
private int positionSaved;
private int maxLines;
public MaxEditText(Context context, int maxLines) {
super(context);
this.maxLines = maxLines;
this.setLines(maxLines);
this.setSingleLine(false);
this.setGravity(Gravity.TOP);
this.addTextChangedListener(this);
}
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
saved = arg0.toString();
positionSaved = ((EditText) this).getSelectionStart();
}
@Override
public void afterTextChanged(Editable arg0) {
if (this.getLineCount() > maxLines)
{
this.setText(saved);
((EditText) this).setSelection(positionSaved-1);
}
}
}
在我看来,有点像黑客一样需要撤消'输入内容与防止首先输入文本相反,所以如果有人有替代方案,请发布。