如何使android edittext提示中心和左侧光标

时间:2015-08-03 05:31:43

标签: android android-edittext

如何在EditText的中心设置提示文本并将光标设置在EditText的左侧部分?当我开始输入文本时,它从中心EditText开始?

enter image description here

现在我有

enter image description here

CATEGORY

9 个答案:

答案 0 :(得分:3)

这是一个有点愚蠢的问题,我知道.. 最简单的解决方法是(并保持居中文本)使用这个简单的黑客:

public class TestClass extends javafx.application.Application
{
   @Override
   public void start(javafx.stage.Stage primaryStage) 
   {
      javafx.scene.control.Button button = new javafx.scene.control.Button("click me");
      button.setOnAction((javafx.event.ActionEvent event) -> { chooseImageAndDisplay(); });

      javafx.scene.layout.BorderPane pane = new javafx.scene.layout.BorderPane();
      pane.setCenter(button);
      pane.setPrefSize(300, 200);
      javafx.scene.Scene scene = new javafx.scene.Scene(pane);
      primaryStage.setTitle("imageViewer"); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
   }

   private void chooseImageAndDisplay() 
   {
      javafx.stage.FileChooser fc = new javafx.stage.FileChooser();
      fc.getExtensionFilters().addAll(new javafx.stage.FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"));

      java.io.File selectedFile = fc.showOpenDialog(null);

      if (selectedFile != null) 
      {
         String location = (selectedFile.getAbsoluteFile().toURI().toString());

         javafx.scene.layout.BorderPane pane = new javafx.scene.layout.BorderPane();
         pane.setPrefSize(300, 200);
         javafx.scene.image.ImageView iw = new javafx.scene.image.ImageView(location);
         pane.setCenter(iw);

         javafx.scene.Scene scene = new javafx.scene.Scene(pane);
         javafx.stage.Stage stage = new javafx.stage.Stage();
         stage.setTitle("imageViewer"); 
         stage.setScene(scene); 
         stage.show(); 
      }
   }

   public static void main(String[] args)
   {
      launch(args);
   }
}

答案 1 :(得分:3)

EditText集中注意力时,您可以隐藏提示 使用我的自定义EditText
https://gist.github.com/repitch/2ca5b01a842609cfe26f3a41f825a300

public class HintHideEditText extends EditText {

    private CharSequence savedHint;

    public HintHideEditText(Context context) {
        super(context);
    }

    public HintHideEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HintHideEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        validateHint(focused);
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    public CharSequence getSavedHint() {
        return savedHint;
    }

    public void setSavedHint(CharSequence savedHint) {
        this.savedHint = savedHint;
        validateHint(hasFocus());
    }

    public void setSavedHint(@StringRes int resid) {
        setSavedHint(getContext().getResources().getText(resid));
    }

    private void validateHint(boolean focused) {
        if (focused) {
            savedHint = getHint();
        }
        setHint(focused ? "" : savedHint);
    }

}

答案 2 :(得分:2)

我也遇到了同样的问题,想到了两种可能的变种:

<强> 1。很简单
提示中间的光标看起来很不愉快 所以我只是删除提示,使editText获得焦点,否则将其设置为:

'myuser'@'localhost'

<强> 2。一些硬编码
在这种情况下:
如果editText为空:
- 设置文字提示
- 将textColor设置为hintColor
- 禁用文本选择
- 在文本(background-size: contain

之前设置选择

如果用户输入任何符号
- 用&#34;&#34;&替换提示 - 将textColor设置回textColor
- 启用文本选择

步骤:
2.1添加TextWatcher

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        editText.setHint(hasFocus ? "" : "My hint");
    }
});

2.2设置焦点更改侦听器:

setSelection(0)

2.3方法editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // empty } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // empty } @Override public void afterTextChanged(Editable s) { processChangedText(s); } });

中有一点魔力
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
       if (hasFocus) {
           processChangedText(editText.getText());
       }
    }
});

2.4启动器/禁用器光标移动方法(可能不是一个好的选择,创建自己的EditText覆盖onSelectionChanged方法更好)

processChangedText(Editable s)

P.S。我真的建议你使用第一个变体,它很简单,看起来很不错。

答案 3 :(得分:1)

在视图膨胀后,将以下代码放入代码中:

EditText editText = (EditText)findViewById(R.id.loginEmailField);
editText.setSelection(0);

它会将插入符号放在提示文本的开头。一旦你开始输入,文字将保持居中,插入符号将在你输入的内容结束时移动。

答案 4 :(得分:0)

没有直接的方法,但您可以尝试使用以下代码

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="48dp">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:layout_gravity="center"
        android:hint="You text here"/>
</FrameLayout>

为父框架布局提供下划线背景,并在其点击上将焦点放在editext上

答案 5 :(得分:0)

而不是使用编辑文本的提示:

  1. 为EditText的背景颜色添加透明度
  2. 在EditText后面直接添加一个新的TextView - 将其文本设置为提示文本。
  3. 在EditText中设置gravity="left" - 这样光标就会位于视图的左侧。
  4. 将两个视图(EditText和TextView)放在RelativeLayout中 - 这样您就可以将提示视图放在TextView后面。

答案 6 :(得分:0)

试试我的代码:

android:textCursorDrawable="@null"

答案 7 :(得分:0)

您可以添加其他View以下编辑文字以模拟编辑文字行,将编辑文字背景设置为null,将宽度设置为wrap_content,将layout_gravity设置为居中。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@null"
        android:cursorVisible="true"
        android:ellipsize="start" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ffffff" />
</LinearLayout>

答案 8 :(得分:0)

在xml中,EditText必须具有android:layout_width="wrap_content"

然后,按如下所示设置代码:

final EditText msgTxt = (EditText) view.findViewById(R.id.edtTxt);

msgTxt.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if(s.length() != 0){
            msgTxt.setGravity(Gravity.CENTER);
        }
        else{
            msgTxt.setGravity(Gravity.CENTER_VERTICAL);
        }
    }
});
相关问题