如何限制AlertDialog

时间:2015-07-14 05:00:40

标签: android android-layout

我在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中。任何帮助或建议将不胜感激。

3 个答案:

答案 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);
    }
}

}

在我看来,有点像黑客一样需要撤消'输入内容与防止首先输入文本相反,所以如果有人有替代方案,请发布。