myEditText.setText未在页面上刷新

时间:2012-11-19 23:32:03

标签: android eclipse

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

当我点击按钮时,按钮中的文字存储在char[]myEditText.getText()显示正在发生这种情况)中,焦点将移至下一个EditText onFocusListener()Log输出显示这一切都正确发生。

11-20 10:19:56.969: I/DebugA(17742): Pin1 updated to: 1 // Pin1 is the ID
11-20 10:19:58.289: I/DebugA(17742): Pin2 updated to: 2 // '2' is Pin2.getText()
11-20 10:19:58.849: I/DebugA(17742): Pin3 updated to: 3
11-20 10:19:59.659: I/DebugA(17742): Pin4 updated to: 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();
        }

    }
};

1 个答案:

答案 0 :(得分:1)

除了活动中的setContentView之外,您看起来还在使用布局inflater。并影响inflater引用的edittexts。尝试删除使用inflater并仅依靠setContentView来完成此部分活动。您可能在不正确的视图层次结构中执行。