1

我正在开发一个 Android 应用程序,我有 2 个编辑视图和一个标签。用户可以输入 2 个值,标签显示使用来自编辑视图的输入进行的一些计算。我想要的是以下内容;

  1. 用户使用软键盘输入任一值
  2. 用户按下“返回”软键
  3. editview 应该失去焦点
  4. 软键盘应该消失
  5. 应该重新计算 textview 标签

现在,v.clearFocus 似乎只在有另一个小部件可以获得焦点(?)时才有效,所以我还添加了一个虚拟零像素布局,可以从第一个编辑视图“窃取”焦点。Return 键现在可以使用,但是当用户通过简单的点击将焦点从 edit1 切换到 edit2 时,HideKeyboard() 就会崩溃。我试过检查是否 inputMethodManager==null 但这没有帮助。

这一切都感觉就像我在欺骗 Android 做一些常见的 UI 行为,所以我不禁认为我在这里忽略了一些东西。

任何帮助将不胜感激。顺便说一句,我知道这类似于这个问题:当按下软键盘中的“完成”按钮时,如何失去编辑文本的焦点? 但我已经尝试过了,它不起作用。

所以我的布局xml是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- Dummy control item so that first textview can lose focus -->
    <LinearLayout
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:layout_width="0px"
        android:layout_height="0px"/>

    <EditText
        android:id="@+id/editTest1"
        android:layout_width="250px"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:imeOptions="actionDone" >

    </EditText>


    <EditText
        android:id="@+id/editTest2"
        android:layout_width="250px"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:imeOptions="actionDone" >
    </EditText>


    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test123" />

</LinearLayout>

来源是这样的:

public class CalcActivity extends Activity implements OnFocusChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab2_weight);

        EditText testedit = (EditText) findViewById(R.id.editTest1);

        testedit.setOnFocusChangeListener(this);

        testedit.setOnEditorActionListener(new OnEditorActionListener() {        

            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId==EditorInfo.IME_ACTION_DONE){
                    //Clear focus here from edittext
                    Log.d("test app", "v.clearFocus only works when there are other controls that can get focus(?)");
                    v.clearFocus();
                }
            return false;
            }
        });
    }

    public void hideSoftKeyboard() {
        InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
    }

    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus == false) {
            Log.d("unitconverter", "onFocusChange hasFocus == false");
            // update textview label
            TextView bla = (TextView) findViewById(R.id.textView1);
            bla.setText(String.format("%s + %s", (((EditText) findViewById(R.id.editTest1)).getText()), (((EditText) findViewById(R.id.editTest2)).getText()))); 
            // hide keyboard
            hideSoftKeyboard();
        }
    }

}
4

0 回答 0