0

「FragmentActivity」に1つのEdittextと1つのボタンを持つ1つの単純なプロジェクト(API10)があります。主な目標は、「ダイアログを開く」ボタンをクリックするとカスタムダイアログがポップアップし、「ポジティブ」ボタンをクリックするとダイアログが閉じ、(Fragmentactivity の) Edittext に「ポジティブ」と表示されることです... (ネガティブ ボタンの場合と同じ動作)。

クリックしてダイアログを開くときと、画面を回転させて正/負ボタンをクリックする前を除いて、すべて正常に動作しますが、この回転の後、正/負ボタンをクリックしても何も起こりませんエディットテキスト?!

実際の Edittext を見つけることができるように「applytext」メソッドを作成しましたが、成功しませんでした。

何が起こっているのかを理解するのを手伝ってもらえますか?

(注: これは、dialogFragment を使用しているため、問題を示すために作成した簡単な例ですが、同じ問題の動作があります)。

これは私のコードです(MainActivity.java):

public class MainActivity extends FragmentActivity {


    private Button bt;
    private EditText et; 



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



        bt = (Button) findViewById(R.id.bt_openDialog);
       // et = (EditText) findViewById(R.id.editText_result);


        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                final Dialog d = new Dialog(MainActivity.this, R.style.AppThemeModificado);
                d.requestWindowFeature(Window.FEATURE_NO_TITLE);
                d.setContentView(R.layout.signinlayout);




                Button c = (Button) d.findViewById(R.id.bt_cancelar);

                c.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {



                    //  et.setText("Negative");

                        applytext("Negative");

                        d.dismiss();


                    }
                });


                Button e = (Button) d.findViewById(R.id.bt_entrar);

                e.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {


                    //  et.setText("Positive");
                        applytext("Positive");

                        d.dismiss();

                    }
                });


                WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                lp.copyFrom(d.getWindow().getAttributes());
                lp.width = WindowManager.LayoutParams.FILL_PARENT;
                //lp.height = WindowManager.LayoutParams.FILL_PARENT;
                d.show();
                d.getWindow().setAttributes(lp);



            }
        });






    }





    private void applytext(String text) {


        Log.d("HugoXp", "----in");

        et = (EditText) findViewById(R.id.editText_result);


        if (et == null) {

            Log.d("HugoXp", "et = null");

        }else{

            Log.d("HugoXp", "et <> null");
            Log.d("HugoXp", "Text that was in the et: " + et.getText().toString());
            Log.d("HugoXp", "actual 'String text': " + text);           
        }



        et.setText(text);


        Log.d("HugoXp", "----out");
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    }

(ファイル: signinlayout.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/outrashape"
    android:orientation="vertical" >




    <ImageView
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name"
        android:scaleType="center"
        android:src="@drawable/logoheader" />


    <EditText
        android:id="@+id/username"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="16dp"
        android:hint="@string/username"
        android:inputType="textEmailAddress" />



    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="4dp"
        android:hint="@string/password"
        android:inputType="textPassword"
        android:typeface="serif" />






    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Applied theme"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >








        <Button
            android:id="@+id/bt_entrar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:background="@drawable/estilobotaored"
            android:text="Positive" />






        <Button
            android:id="@+id/bt_cancelar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:background="@drawable/estilobotaored"
            android:text="Negative" />

    </LinearLayout>

</LinearLayout>
4

1 に答える 1

0

Android AlertDialog Fragment の使用を検討してください。いくつかの点で柔軟性がわずかに劣りますが、ここで必要なことを正確に行うようです。ただし、これはあなたの問題がある場所ではありません。

いずれにせよ、このようなことを行うことでダイアログを作成します (別のファイルでも同じアクティビティでも問題ありません)。

public static class MyAlertDialogFragment extends DialogFragment {

public static MyAlertDialogFragment newInstance(int title) {
    MyAlertDialogFragment frag = new MyAlertDialogFragment();
    Bundle args = new Bundle();
    args.putInt("title", title);
    frag.setArguments(args);
    return frag;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    int title = getArguments().getInt("title");

    return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.alert_dialog_icon)
            .setTitle(title)
            .setPositiveButton(R.string.alert_dialog_ok,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doPositiveClick();
                    }
                }
            )
            .setNegativeButton(R.string.alert_dialog_cancel,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doNegativeClick();
                    }
                }
            )
            .create();
    }
}

次に、呼び出しアクティビティから、次のコールバック メソッドを使用できます。

void showDialog() 
{
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(
        "Title");
        newFragment.show(getFragmentManager(), "dialog");
}

public void doPositiveClick() {

    Log.i("FragmentAlertDialog", "Positive click!");
    editText.setText("positive");
}

public void doNegativeClick() {
    // Do stuff here.
    Log.i("FragmentAlertDialog", "Negative click!");
    editText.setText("negative");
}

したがって、ボタン onClick() では、showDialog() を呼び出すだけで、残りは期待どおりに機能するはずです。

于 2012-11-16T14:06:35.333 に答える