0

チェックボックスをヘルプ画面にコード化しようとしています。これは基本的にポップアップ ビュー (メイン プログラムによって開始されるアクティビティ) であり、ヘルプ テキストと [OK] ボタンを含む ScrollView と、必要かどうかを尋ねるチェックボックスが含まれています。プログラムの開始時にヘルプ画面が自動的に表示されるようにします。すべてが画面に正しく表示され、タッチするとチェックボックスが切り替わります。ただし、[OK] を押すと、チェックボックスの状態を .isChecked() でテストすると、常に false になります。私が見逃したのは単純なことだと確信しています。XML ファイルは次のとおりです。

helpdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:background="#ffffff">

 <ScrollView android:id="@+id/ScrollView01"
 android:layout_width="wrap_content" android:layout_below="@+id/ImageView01"
 android:layout_height="300px">

 <TextView android:text="@+id/helpView" android:id="@+id/helpView"
 android:layout_width="wrap_content" android:layout_height="wrap_content"
 android:textColor="#000000"/>

</ScrollView>
<Button android:id="@+id/Button01" 
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:text="  OK  "
android:layout_below="@id/ScrollView01"/>

<CheckBox android:id="@+id/chkNoHelp" android:textColor="#000000"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" android:text="Don't Display at Startup"
android:layout_below="@id/Button01"        />  

</RelativeLayout>

HelpBox.java:

public class HelpBox extends Activity {

CheckBox checkBox;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     //set up dialog
    Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.helpdialog);
    dialog.setTitle("Help");
    dialog.setCancelable(true);

    //set up text
    TextView text = (TextView) dialog.findViewById(R.id.helpView);
    text.setText(getString(R.string.help_text));

    //set up button
    Button button = (Button) dialog.findViewById(R.id.Button01);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Boolean mDisplayHelp;

            setContentView(R.layout.helpdialog);

            checkBox = (CheckBox) findViewById(R.id.chkNoHelp);
            if (checkBox.isChecked()) {
                mDisplayHelp = true;
            } else {
                mDisplayHelp = false;
            }
            finish();
        }
    });
    //now that the dialog is set up, it's time to show it    
    dialog.show();
}
}

両方の「mDisplayHelp」行にブレークポイントを設定すると、[OK] ボタンが押されたときにチェック ボックスに緑色のチェックが表示されるかどうかに関係なく、常に「false」ブランチでブレークします。

前もって感謝します。

編集 (10/10):

私がやりたいことは明確で、ユーザーがダイアログを終了した後に情報を取得することです。そのため、チェックボックスの状態を感知して、それを設定として保存できます。このためには、onDestory でテストする必要があると思います。だから、私はそれをしました:

@Override
public void onDestroy() {
    Boolean mDisplayHelp;

    setContentView(R.layout.helpdialog);        
    checkBox = (CheckBox) findViewById(R.id.chkNoHelp);
    if (checkBox.isChecked()) {
        mDisplayHelp = true;
    } else {
        mDisplayHelp = false;
    }

}

ただし、チェックボックスが表示されているかどうかに関係なく、結果として常に FALSE を考えています。この場合、setContentView を含めないと、isChecked で NullPointerException が発生します。

4

2 に答える 2

3

setContentView をもう一度呼び出すのはなぜですか? 2回目に呼び出した後、チェックボックスはオフ(デフォルトの状態)にリセットされ、すぐにその状態をチェックしてフラグを設定しています。

ダイアログで1回、メインアクティビティで1回、helpdialog.xmlを2回膨張させることで、ここでの意図が明確ではありません。ここでダイアログをテーマにしたアクティビティを使用し、onCreate で setContentView() を 1 回だけ呼び出したいようです。その後、期待どおりに動作するはずです。

于 2011-10-07T20:35:58.983 に答える
1

私はついにこれを理解しました、そして男の子は私が物事を間違った方法で行っていました。学習曲線までそれをチョークします。

チェックボックスの状態を保存する必要がありました。そのためにSharedPreferencesを使用する必要がありました。チェックボックスのリスナーを使用してチェックボックスがタッチされたことを検出し、その時点で設定を保存する必要がありました。ヘルプボックスを開いたら、設定状態をロードし、チェックボックスをその状態に設定して、ユーザーの以前の設定に基づいて正しく表示されるようにします。

最後に、メインアクティビティでonCreateに設定をロードし、設定が設定されている場合はshowHelpBox()を呼び出します。

onCreateのメインアクティビティ:

    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    Boolean mDisplayHelp = prefs.getBoolean("checkboxPref", false);
    if (mDisplayHelp == false)
        showHelpBox();

ヘルプボックスアクティビティで、以前の設定に基づいてチェックボックスを事前に初期化します。

    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    mDisplayHelp = prefs.getBoolean("checkboxPref", false);
    final CheckBox ckBox = (CheckBox) dialog.findViewById(R.id.chkNoHelp);
    ckBox.setChecked(mDisplayHelp);

チェックボックスがタッチされたとき:

    ckBox.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

          if (ckBox.isChecked()) {
            mDisplayHelp = true;
          } else {
            mDisplayHelp = false;
          }
          SharedPreferences.Editor editor = prefs.edit();
          editor.putBoolean("checkboxPref", mDisplayHelp);

          // Don't forget to commit your edits!!!
          editor.commit();
        }
    });

うまくいけば、他の人が私の愚かな間違いや誤解から学ぶことができます。

于 2011-10-10T19:47:21.693 に答える