본문 바로가기
Mobile/Android

[Android] EditText 작업 중 Softkeyboard(키보드) 띄워져있는 중 OnBackPressed 처리 막기

by C_Meaning 2021. 11. 9.
728x90

안드로이드에서 EditText 작업 중 키보드를 항상 띄워 놓고 싶을 때 Back키가 눌렸을때의 이벤트를 상쇄시키는 방법이다.

 

1. EditText 확장시키기

EditText의 기능을 확장시켜 Back키에 대해 처리할 코드를 추가한다.

 

BackPressedEditText.java

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;

public class BackPressedEditText extends androidx.appcompat.widget.AppCompatEditText
{
    public BackPressedEditText( Context context )
    {
        super( context );
    }

    public BackPressedEditText( Context context, AttributeSet attribute_set )
    {
        super( context, attribute_set );
    }

    public BackPressedEditText( Context context, AttributeSet attribute_set, int def_style_attribute )
    {
        super( context, attribute_set, def_style_attribute );
    }

    @Override
    public boolean onKeyPreIme( int key_code, KeyEvent event )
    {
        if ( key_code == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP )
            return true;
        return super.onKeyPreIme( key_code, event );
    }
}

2. xml에 적용하기

확장한 EditText 클래스를 xml 위젯에 적용한다.

<com.sample.BackPressedEditText
            android:id="@+id/edit"
            android:layout_width="303px"
            android:layout_height="90px"
            android:hint="@string/gogo"
            android:textSize="30px" />

 

응용하기

3. 소프트키보드를 내리지 않고 코드 처리하기

set 메소드를 따로 만들어서 값을 받아온 뒤, 그 값을 이용해 키보드를 내리지 않고 처리한다.

적용된 EditText마다 객체가 따로 생성되어 있기 때문에 값을 다르게 주면, 결과가 전부 다르게 작용한다.

 

BackPressedEditText.java

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;

import com.mtx.app.pbv01.listener.OnButtonSelectedListener;

public class BackPressedEditText extends androidx.appcompat.widget.AppCompatEditText {

    public OnListener listener;
    public String fName = null;

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

    public BackPressedEditText(Context context, AttributeSet attribute_set) {
        super(context, attribute_set);
    }

    public BackPressedEditText(Context context, AttributeSet attribute_set, int def_style_attribute) {
        super(context, attribute_set, def_style_attribute);
    }

    public void backward(String name) {
    	//외부에서 받아올 값을 저장하는 set 메소드
        fName = name;
    }

    @Override
    public boolean onKeyPreIme(int key_code, KeyEvent event) {
        if (key_code == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            //처리할 코드 넣기
            if (fName != null) {
                listener = (OnListener) super.getContext();
                listener.onListener(fragmentName);
            }
            return true; //반드시 True 리턴하기
        }
        return super.onKeyPreIme(key_code, event);
    }
}

 

아래는 값을 전달하는 코드와 실제 처리하는 부분이다.

MainActivity.java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        back_editText = (BackPressedEditText) findViewById(R.id.back_edit);
        
        //set메소드를 통해 값 전달
        back_editText.backward = fname;
    }
    
    @Override
    public void onBackPressed() {//비워놔도 된다.}
728x90

댓글