EditText에 초점 설정


178

EditText-Field가 있고 OnFocusChangeListener를 설정했습니다. 포커스를 잃으면 데이터베이스에있는 EditText의 값을 확인하는 메소드가 호출됩니다. 메서드의 반환 값이 true이면 토스트가 표시되고 EditText에서 포커스가 다시 나타납니다. 포커스는 항상 EditText에 다시 나타나고 메서드의 반환 값이 false가 될 때까지 키보드가 표시되어야합니다.

편집 : 내 실제 문제를 아직 완전히 명확하게하지 않았다고 생각합니다 : EditText의 값이 값으로 편집 될 때까지 화면의 다른 항목을 편집 할 수 없어야합니다. "거짓을 반환합니다. EditText-Field 만 편집 가능해야합니다.

여기 내 코드가 있습니다 (작동하지 않습니다).

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();
                }
            }

그리고 방법 :

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;
}

이 코드는 다음과 같은 결과를 초래합니다. EditText가 포커스를 잃은 후 포커스가 EditText로 되돌아 가지만 더 이상 텍스트를 편집 할 수 없습니다.

EDIT2 : 내 코드가 변경되었습니다. 대본:

첫 번째 EditText를 클릭하고 이미 데이터베이스에있는 String을 넣습니다. 토스트가 보이고있다. 이제 더 이상 문자열을 편집 할 수 없습니다. 키보드에서 "다음"을 클릭하면 첫 번째 EditText에 포커스가 유지됩니다. 내 문자열을 편집하려고 시도했지만 아무 일도 일어나지 않습니다. 대신 내 새 문자열이 두 번째 EditText에 표시됩니다. 장치의 뒷면 화살표를 클릭하고 첫 번째와 두 번째 EditText를 다시 클릭하십시오-> 키보드가 표시되지 않습니다.

내 새 코드는 다음과 같습니다.

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();
        }
    }
}

아래 답변이 도움이
되시면

답변:


278

이 줄을 onCreate()

editText.requestFocus();

그것은 나를 위해 일하고, 그것이 도움이되기를 바랍니다.


163

포커스를 요청하는 것만으로는 키보드가 표시되지 않습니다.

초점을 맞추고 키보드를 표시하려면 다음과 같이 작성하십시오.

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

편집 : checkLiganame 메소드가 추가 된 후 답변에 추가 정보 추가

checkLiganame 메소드에서 커서가 널인지 확인하십시오. 커서는 항상 객체를 반환하므로 null 검사는 아무 것도 수행하지 않습니다. 그러나 문제는 라인에 있습니다db.close();

데이터베이스 연결을 닫으면 Cursor유효하지 않게되고 대부분 널이됩니다.

따라서 값을 가져온 후 데이터베이스를 닫으십시오.

커서가 널인지 확인하는 대신 리턴되는 행 수가 0보다 큰지 확인해야합니다. if (cursor.getCount ()> 0) 그런 다음 부울을 true로 설정하십시오.

EDIT2 : 작동 방법에 대한 코드는 다음과 같습니다. EDIT3 : 내가 추가 한 잘못된 코드가 잘못되었습니다 ...; S

우선, 다른 사람 EditText이 초점을 맞추면 초점을 깨끗하게해야합니다 . 이 작업을 수행 할 수 있습니다 myEditText.clearFocus(). 그런 다음 onFocusChangeListener에서 처음 EditText초점이 있는지 여부를 신경 쓰지 않아야 하므로 onFocusChangeListener는 다음과 같이 보일 수 있습니다.

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();
            }
        }
    }
}

첫 번째 수표 if(liganame.length() == 0)를 자신의 수표로 바꾸면 정상적으로 작동합니다. onFocusChangeListener예제에서 한 것처럼 모든 EditText 뷰가 동일한 리스너로 설정되어 있어야합니다 .


지금까지 감사합니다. 그러나 이것은 내 모든 문제를 해결하지 못합니다. 내 문제에 대한 설명을 편집했습니다.
erdalprinz

checkLiganame은 정확히 무엇을하고 있습니까? 왜 당신이 if (liganame.isEmpty ())를 확인할 수없고 그것이 사실이라면, requestFocus를 다시 요청 하시겠습니까?
Darwind

1
감사합니다 :-) 이제 내 방법이 올바르게 작동합니다 :-) 그러나 EditText-Field의 주요 문제는 아직 해결되지 않았습니다. 메소드가 행을 찾은 후에도 여전히 편집 할 수 없습니다.
erdalprinz

그래서 당신은 if (myEditText.requestFocus ()) {getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } onFocusChanged 리스너 내부?
Darwind

그래, 내가 했어. Liganame.requestFocus ();에서 키보드에서 "다음"을 클릭하여 다음 EditText-Field로 이동합니다. 토스트가 보이고 초점은 EditText-Fields에 있습니다. 그러나 나는 두 번째 것을 편집 할 수 있습니다. 이 경우에 초점을 두어야하는 유일한 것은 더 이상 편집 할 수 없습니다.
erdalprinz

59

Darwind 코드가 키보드를 표시하지 않았습니다.

이것은 나를 위해 작동합니다 :

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

키보드가 표시되지 않으면 다음을 수행하십시오.

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

버튼을 클릭하면 EditText의 포커스가 변경됩니다.

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

이것은 나에게서 작동합니다.

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

숨기려고:

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

1
왜 200ms를 기다려야합니까? 필요한가요 아니면 바로 보여줄 수 있습니까?
Coder123

11

이것은 나를 위해 일한 것입니다. 초점을 설정하고 키보드도 보여줍니다.

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
감사. setFocusableAPI 26이 필요합니다. setFocusableInTouchMode필자의 경우에는 필요하지 않았습니다.
CoolMind

8

EditText를 동적으로 생성하면 아래와 같이 requestFocus ()를 설정해야합니다.

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

이미 xml 뷰에서 구성 요소를 선언했다면 해당 구성 요소를 찾아서 아래에 주어진대로 초점을 맞출 수 있습니다.

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

해당 EditText 구성 요소에만 포커스를 설정합니다.


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

Xamarin.Android의 경우이 확장을 만들었습니다.

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

이 코드를 매니페스트에서 사용해보십시오

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

2

requestFocus()레이아웃이 팽창하기 전에 전화를 걸면 false가 반환됩니다. 이 코드는 레이아웃이 팽창 된 후에 실행됩니다. 위에서 언급 한대로 200ms 지연이 필요하지 않습니다 .

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

1

해결 방법을 찾았지만 포커스를 다시 요청한 후 편집 문제가 있는지 모르겠습니다.

당신은 호출하는 방법을 시도 selectAll()하거나 setSelection(0)당신의 edittext1에 (emtpy 인 경우)?

이것이 도움이되는지 알려 주시면 완전한 해결책에 대한 답변을 편집하겠습니다.


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

0

requestFocus()in을 사용하면 onCreate()키보드가 탭에 표시되지 않는 문제가 발생 BindingAdapter하면 SingleLiveEvent를 사용 하여 포커스를 요청하십시오.

방법은 다음과 같습니다.

바인딩 어댑터

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

0

내 대답은 여기

공식 문서를 읽었을 때 이것이 최선의 대답이라고 생각합니다 .EditText와 같은 매개 변수에보기를 전달하면 showSoftKeyboard가 가로 방향으로 작동하지 않는 것처럼 보입니다.

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)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.