1

我有一个简单的活动,需要使用自定义密码键盘(屏幕上的按钮)接受 4 位 PIN 码。数字存储在四个 EditText 中。

当我单击一个按钮时,按钮中的文本存储在 a char[](myEditText.getText()表明正在发生这种情况),焦点EditText通过 an移动到下一个onFocusListener(),并且Log输出显示这一切都正确发生。

11-20 10:19:56.969: I/DebugA(17742): Pin1 更新为:1 // Pin1 是 ID
11-20 10:19:58.289: I/DebugA(17742): Pin2 更新为: 2 // '2' is Pin2.getText()
11-20 10:19:58.849:I/DebugA(17742):Pin3 更新为:3
11-20 10:19:59.659:I/DebugA(17742):Pin4 更新为:4

屏幕本身根本没有更新。EditTexts 都显示为空,即使代码执行得很好。

我已经查看了关于 SO 的一大堆答案,并尝试了许多完全没有运气的建议,所以我发布了这个问题,希望有人能对此有所了解!这事发生在别人身上过吗?

这是一些布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="42dp" >

<EditText
    android:id="@+id/Pin1"
    android:tag="Pin1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="2"
    android:gravity="center_vertical|center_horizontal"
    android:nextFocusDown="@+id/Pin2"
    android:maxLength="1"
    android:inputType="textPassword" />

...
...
...

</RelativeLayout>

...按钮是:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="21dp"
android:layout_below="@+id/layout1" >

<Button
    android:id="@+id/Button01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="btnPinClick"
    android:text="1" />

<Button
    android:id="@+id/Button02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="btnPinClick"
    android:layout_marginLeft="21dp"
    android:text="2" />

<Button
    android:id="@+id/Button03"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="btnPinClick"
    android:layout_marginLeft="21dp"
    android:text="3" />

</LinearLayout>

该活动是标准活动 ( MyActivity extends Activity)。

有什么想法吗?

更新
这里是一些要求的java:

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

    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    RelativeLayout layout = (RelativeLayout)inflater.inflate(R.layout.activity_login, null);

    EditText Pin1 = (EditText) layout.findViewById(R.id.Pin1);
    Pin1.setOnFocusChangeListener(focusListener);
    Pin1.setText("1");                 // <--THIS HAS NO EFFECT
    EditText Pin2 = (EditText) layout.findViewById(R.id.Pin2);
    Pin2.setOnFocusChangeListener(focusListener);
    EditText Pin3 = (EditText) layout.findViewById(R.id.Pin3);
    Pin3.setOnFocusChangeListener(focusListener);
    EditText Pin4 = (EditText) layout.findViewById(R.id.Pin4);
    Pin4.setOnFocusChangeListener(focusListener);
...
...
...
}

Onclick方法是:

public void btnPinClick(View btnPin) {
    String PinNumber = ((Button)btnPin).getText().toString();
    RelativeLayout layout = (RelativeLayout)getLayoutInflater().inflate(R.layout.activity_login, null);

    ArrayList<View> views = (ArrayList<View>) layout.getFocusables(View.FOCUS_DOWN);
    EditText nextItem = null;

    for (int i = 0; i < views.size(); i++) {
                    // THIS IS THE CORRECT EditText FOR EACH OF THESE
        EditText textBox = (EditText) views.get(i);
        if (textBox.getTag().toString().equals(currentText)) {
            textBox.setText(PinNumber);
            pin[i] = PinNumber.toCharArray()[0];
            Log.i("DebugA", textBox.getTag().toString() + " updated to: " + textBox.getText().toString());
            textBox.invalidate();
            textBox.refreshDrawableState();
            if(i+1 < views.size()) {
                nextItem = (EditText) views.get(i+1);
            }
            else {
                doCheckPin();
            }
            break;
        }
    }
    if(nextItem != null){
        nextItem.requestFocus();
        currentText = nextItem.getTag().toString();
    }
}

更新 2
以下是 OnFocusChangeListener 请求的代码:

protected OnFocusChangeListener focusListener = new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
                            //THIS SIMPLY SETS A VARIABLE STRING TO SAY WHICH 
                            //EditText HAS FOCUS.
            currentText = v.getTag().toString();
        }

    }
};
4

1 回答 1

1

看起来您除了在活动中使用 setContentView 之外还使用了布局充气器。并影响充气机引用的编辑文本。尝试删除充气器的使用,并完全依赖 setContentView 来完成这部分活动。您可能在不正确的视图层次结构中执行。

于 2012-11-20T05:36:40.920 回答