1

カスタム ピンパッド (画面上のボタン) を使用して 4 桁の PIN 番号を受け入れる必要がある単純なアクティビティがあります。数字は 4 つの EditText に格納されます。

ボタンをクリックすると、ボタン内のテキストがchar[](myEditText.getText()これが発生していることを示します) に保存され、フォーカスが をEditText介して次のボタンに移動し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' は Pin2.getText() です
11-20 10:19:58.849: I/DebugA(17742): Pin3 が次のように更新されました: 3
11-20 10:19:59.659: I/DebugA(17742): Pin4 が次のように更新されました: 4

画面自体は単に更新されていません。コードは完全に実行されますが、EditText はすべて空に見えます。

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

UPDATE 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 に答える