Đặt tiêu điểm vào EditText


177

Tôi có một EditText-Field và đặt OnF FocusChangeListener cho nó. Khi nó bị mất tiêu điểm, một phương thức được gọi, nó sẽ kiểm tra giá trị của EditText với một phương thức trong cơ sở dữ liệu. Nếu giá trị trả về của phương thức là đúng, một bánh mì nướng được hiển thị và tiêu điểm sẽ quay trở lại trên EditText một lần nữa. Trọng tâm phải luôn luôn quay trở lại trên EditText và bàn phím sẽ hiển thị, cho đến khi giá trị trả về của phương thức là sai.

EDIT: Tôi nghĩ rằng, tôi vẫn chưa làm rõ vấn đề thực sự của mình: Không có mục nào khác trên Màn hình có thể chỉnh sửa, cho đến khi giá trị của EditText được chỉnh sửa thành giá trị, điều này làm cho phương thức "checkLiganame (liganame) "Trả lại sai. Chỉ có thể chỉnh sửa Trường Chỉnh sửa.

đây là mã của tôi (không hoạt động với tôi):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

và phương pháp:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

Mã này dẫn đến kết quả sau: Sau khi EditText bị mất tiêu điểm, tiêu điểm sẽ quay trở lại EditText, nhưng tôi không thể chỉnh sửa văn bản nữa.

EDIT2: Thay đổi mã của tôi. Kịch bản:

Tôi nhấp vào EditText đầu tiên và đặt một Chuỗi trong đó, đã có trong cơ sở dữ liệu. Bánh mì nướng đang hiển thị. Bây giờ tôi không thể chỉnh sửa Chuỗi của mình nữa. Tôi bấm "next" trên bàn phím và tiêu điểm vẫn ở EditText đầu tiên. Tôi cố gắng chỉnh sửa Chuỗi của tôi, nhưng không có gì xảy ra. Thay vào đó, Chuỗi mới của tôi hiển thị trong EditText thứ hai. Tôi nhấp vào mũi tên lùi của thiết bị của mình và đọc lại trên EditText thứ nhất và thứ hai -> không có bàn phím nào hiển thị.

Đây là Mã mới của tôi:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

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

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

Nếu các câu trả lời dưới đây giúp bạn, vui lòng chấp nhận một trong những câu trả lời
Akshatha Srinivas

Câu trả lời:


276

Chỉ cần đặt dòng này trên của bạn onCreate()

editText.requestFocus();

Nó làm việc cho tôi, hy vọng nó sẽ giúp


163

Yêu cầu tập trung không đủ để hiển thị bàn phím.

Để lấy nét và hiển thị bàn phím, bạn sẽ viết một cái gì đó như thế này:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

EDIT: Thêm thông tin bổ sung vào câu trả lời sau khi phương thức checkLiganame được thêm vào.

Trong phương thức checkLiganame, bạn kiểm tra xem con trỏ có rỗng không. Con trỏ sẽ luôn trả về một đối tượng, vì vậy việc kiểm tra null không làm gì cả. Tuy nhiên, vấn đề là ở dòngdb.close();

Khi bạn đóng kết nối cơ sở dữ liệu, Cursor trở nên không hợp lệ và rất có thể là null.

Vì vậy, hãy đóng cơ sở dữ liệu sau khi bạn lấy giá trị.

Thay vì kiểm tra con trỏ cho null, bạn nên kiểm tra xem số lượng hàng được trả về có nhiều hơn 0 hay không: if (con trỏ.getCount ()> 0) và sau đó đặt boolean của bạn thành true nếu có.

EDIT2: Vì vậy, đây là một số mã cho cách làm cho nó hoạt động. EDIT3: Xin lỗi, tôi đã thêm mã sai ...; S

Trước hết, bạn cần phải tập trung rõ ràng nếu người khác EditTexttập trung. Điều này có thể được thực hiện với myEditText.clearFocus(). Sau đó, trong onF FocusChangeListener của bạn, bạn không thực sự quan tâm liệu lần đầu tiên EditTextcó tập trung hay không, vì vậy onF FocusChangeListener có thể trông giống như thế này:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

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

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

Thay thế kiểm tra đầu tiên if(liganame.length() == 0)bằng kiểm tra của riêng bạn, sau đó nó sẽ hoạt động. Xin lưu ý rằng tất cả các khung nhìn EditText nên đặt chúng onFocusChangeListenerthành cùng một trình nghe như tôi đã làm trong ví dụ.


Cảm ơn bạn rất nhiều. Nhưng điều này không giải quyết được toàn bộ vấn đề của tôi. Tôi đã chỉnh sửa mô tả vấn đề của tôi.
erdalprinz

Vậy checkLiganame đang làm gì chính xác? Tại sao bạn không thể kiểm tra xem (liganame.isEmpty ()) và nếu nó là sự thật, requestF Focus lại?
Darwind

1
Cảm ơn bạn :-) Bây giờ phương thức của tôi đang hoạt động chính xác :-) nhưng vấn đề chính của tôi với EditText-Field vẫn chưa được giải quyết. Tôi vẫn không thể chỉnh sửa nó, sau khi phương thức đã tìm thấy một hàng ...
erdalprinz

Vì vậy, bạn đã thêm if (myEditText.requestF Focus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Bên trong trình nghe onF FocusChanged?
Darwind

Có tôi đã làm. Theo Liganame.requestF Focus ();. Tôi bấm "next" trên bàn phím, để nhảy vào EditText-Field tiếp theo. Bánh mì nướng đang hiển thị và trọng tâm là BÓNG EditText-Field. Nhưng tôi chỉ có thể chỉnh sửa cái thứ hai. Cái đầu tiên, là thứ duy nhất có trọng tâm trong trường hợp này, không thể chỉnh sửa được nữa.
erdalprinz

59

Mã Darwind không hiển thị bàn phím.

Điều này làm việc cho tôi:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

trong trường hợp bàn phím không hiển thị, hãy thử buộc:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

Điều này thay đổi trọng tâm của EditText khi nhấp vào nút:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}

16

Điều này hoạt động từ tôi:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Trốn:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
Tại sao bạn cần đợi 200 ms? nó là cần thiết hay tôi chỉ có thể hiển thị nó ngay lập tức?
Coder123

11

Đây là những gì làm việc cho tôi, tập trung và hiển thị bàn phím cũng

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);

1
Cảm ơn. setFocusableyêu cầu API 26. Cũng setFocusableInTouchModekhông cần thiết trong trường hợp của tôi.
CoolMind

8

Nếu chúng ta tạo một EditText một cách linh hoạt thì chúng ta phải đặt requestF Focus () như được đưa ra dưới đây.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Nếu chúng ta đã khai báo thành phần trong chế độ xem xml thì chúng ta phải tìm nó và chúng ta có thể lấy nét như dưới đây.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Nó chỉ tập trung vào thành phần EditText tương ứng.


6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }

4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

2

Bạn có thể làm điều này với một dòng duy nhất:

yourEditText.RequestFocusFromTouch();

Trên thực tế đây là câu trả lời duy nhất làm việc cho tôi. Nó mô phỏng cảm ứng như tôi muốn.
Antonio Vlasic

2

Đối với Xamarin.Android tôi đã tạo phần mở rộng này.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}

2

vui lòng thử mã này trên bảng kê khai

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

2

Nếu bạn cố gắng gọi requestFocus()trước khi bố trí bị thổi phồng, nó sẽ trả về false. Mã này chạy sau khi bố trí được tăng cao. Bạn không cần trì hoãn 200 ms như đã đề cập ở trên .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

Tôi không biết liệu bạn có tìm thấy giải pháp hay không, nhưng đối với vấn đề chỉnh sửa của bạn sau khi yêu cầu tập trung lại:

Bạn đã thử gọi phương thức selectAll()hay setSelection(0)(nếu là emtpy) trên edittext1 của bạn chưa?

Xin vui lòng cho tôi biết nếu điều này có ích, vì vậy tôi sẽ chỉnh sửa câu trả lời của mình thành một giải pháp hoàn chỉnh.


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

0

Nếu sử dụng requestFocus()trong onCreate()giới thiệu vấn đề bàn phím không hiển thị trên máy, hãy sử BindingAdapterdụng SingleLiveEvent và yêu cầu trọng tâm bên trong đó.

Đây là cách thực hiện:

BindingAd CHƯƠNG

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

Câu trả lời của tôi ở đây

Khi tôi đọc trên tài liệu chính thức, tôi nghĩ rằng đây là câu trả lời tốt nhất, chỉ cần chuyển View cho tham số như EditText của bạn, nhưng showSoftPal có vẻ như không hoạt động trên phong cảnh

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.