1

私のメインクラスには、編集テキストを含むダイアログボックスを表示するクラスを呼び出すボタンがあります。私の問題はこれです-メインアクティビティは最初の実行時にedittext値を取得しません。2回目に実行すると、古いedittext値が取得されます。

メイン アクティビティ クラスがコードの完全なブロックを実行し、クラスに格納されている以前の値を返すようです。共有設定を含む多くの方法を試しました。

MainActivity.java

public class MainActivity extends Activity {
    EditText comment_et,input_et;
    Spinner spinner;
    Button addbutton,reportbut;
    String input_string,date,time,comment,item;
    TextView date_tv,time_tv;
    String temp[];
    Datas datatemp;
    String savedinput;

    ArrayList<String> list = new ArrayList<String>();


    ArrayAdapter<String> adapter;
    DatabaseHandler db = new DatabaseHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) 
{

        SharedPreferences prefs = getSharedPreferences("myprefs", 0);
        savedinput=  prefs.getString("KEY_SAVEDINPUT","");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner = (Spinner)findViewById(R.id.spin1);
        input_et = (EditText)findViewById(R.id.input_et);
        addbutton = (Button)findViewById(R.id.addbutton);
        reportbut = (Button)findViewById(R.id.report);

        comment_et = (EditText)findViewById(R.id.comment_et);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        date_tv = (TextView)findViewById(R.id.date_tv);
        time_tv = (TextView)findViewById(R.id.time_tv);

        final Calendar c = Calendar.getInstance();
        int mYear = c.get(Calendar.YEAR);
        int mMonth = c.get(Calendar.MONTH);
        int mDay = c.get(Calendar.DAY_OF_MONTH);
        int mHour = c.get(Calendar.HOUR_OF_DAY);
        int mMinute = c.get(Calendar.MINUTE);

        date = ""+mDay+"/"+mMonth+1+"/"+mYear;
        time = ""+mHour+":"+mMinute;
        date_tv.setText(date);
        time_tv.setText(time);

        int max_id = db.getDatasCount();

        for(int i = 1; i<max_id+1 ;i++)
         {          

        datatemp = db.getItemOnly(i);
        String s = datatemp._item.toString();
        list.add("   "+ s);
         }


        addbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                AlertDialogManager alert = new AlertDialogManager();

                alert.showAlertDialog(MainActivity.this, "Enter Item",
                        "Please enter the spinner item",
                        true);
                System.out.println("main : " +savedinput);

            }   

        });



            reportbut.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent i = new Intent(getApplicationContext(), ListviewActivity.class);
                    startActivity(i);

                }

            });


        spinner.setAdapter(adapter);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {

                item = parent.getItemAtPosition(position).toString();

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {


            }
        });

        Button submit = (Button)findViewById(R.id.save);
        submit.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) 
            {

                 comment  = comment_et.getText().toString();

                    System.out.println("comment:"+comment);

                /**
                 * CRUD Operations
                 * */
                // Inserting Contacts
                Log.d("Insert: ", "Inserting ..");
                db.addData(new Datas(item, comment, date, time));
                Toast.makeText(getApplicationContext(), "Data Submitted Successfully",
                Toast.LENGTH_LONG).show();
                // Reading all contacts
                Log.d("Reading: ", "Reading all contacts..");
                List<Datas> datas = db.getAllDatas();       

                for (Datas d : datas) {
                    String log = "Id: "+d.getID()+" ,Item: " + d.getItem() + " ,Comment: " + d.getComment() + " ,Date: " + d.getDate() + ",Comment: " + d.getTime();
                        // Writing Contacts to log
                Log.d("Item: ", log);
                }
            }
        });
}

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

AlertDialogManager.java

public class AlertDialogManager {
    /**
     * Function to display simple Alert Dialog
     * @param context - application context
     * @param title - alert dialog title
     * @param message - alert message
     * @param status - success/failure (used to set icon)
     *               - pass null if you don't want icon
     * */
    String savedinput;
    public void showAlertDialog(final Context context, String title, String message,
            Boolean status) 
    {
        AlertDialog alertDialog = new AlertDialog.Builder(context).create();

        // Setting Dialog Title
        alertDialog.setTitle(title);

        // Setting Dialog Message
        alertDialog.setMessage(message);

        //setting input
         final EditText input = new EditText(context);
         alertDialog.setView(input);

         // saving input to a string
         savedinput = input.getText().toString();
         System.out.println(savedinput);

        if(status != null)
            // Setting alert dialog icon
            alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);

        // Setting OK Button
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                savedinput = input.getText().toString();

                SharedPreferences prefs = context.getSharedPreferences("myprefs", 0);
                SharedPreferences.Editor editor =prefs.edit();
                editor.putString("KEY_SAVEDINPUT", savedinput);
                editor.commit();                
                System.out.println("from class "+savedinput);
            }
        });



        // Showing Alert Message
        alertDialog.show();

    }

    String getItem()
    {
        return savedinput;
    }
}

さらに明確にするために、ここに私のlogcatがあります

02-01 13:48:43.372: I/System.out(897): main : firstexecute
02-01 13:48:46.942: W/KeyCharacterMap(897): No keyboard for id 0
02-01 13:48:46.942: W/KeyCharacterMap(897): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-01 13:48:49.532: I/System.out(897): from class secondexecute
4

3 に答える 3

3

ここにはいくつかの問題があります。

  1. 読み込まないsavedValueonCreateください。実際に使用する場合にのみ読み込む必要があります。@ρяσѕρєяKの回答を参照してください。
  2. alert.showAlertDialogノンブロッキングです。したがって、ダイアログが表示された後、行System.out.println("main : " + savedInput);が実行されます。入力を待ちません。したがって、ダイアログの[OK]ボタンの共有設定に保存する以外に、他のアクションを呼び出す必要があります。このアクションは、ユーザーがダイアログにテキストを入力した後に発生するロジックを呼び出す必要があります。

アップデート

public void showAlertDialog(final Context context, String title, String message,
                            Boolean status, final Spinner spinner) 
{
    AlertDialog alertDialog = new AlertDialog.Builder(context).create();

    // Setting Dialog Title
    alertDialog.setTitle(title);

    // Setting Dialog Message
    alertDialog.setMessage(message);

    //setting input
     final EditText input = new EditText(context);
     alertDialog.setView(input);

     // saving input to a string
     savedinput = input.getText().toString();
     System.out.println(savedinput);

    if(status != null)
        // Setting alert dialog icon
        alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);

    // Setting OK Button
    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            savedinput = input.getText().toString();
            // do whatever you want with spinner and savedInput here.
        }
    });

    // Showing Alert Message
    alertDialog.show();
 }

onClickをクリックしてダイアログを表示します。

alert.showAlertDialog(MainActivity.this, "Enter Item",
     "Please enter the spinner item",
     true, (Spinner) findViewById(R.id.spin1));

アップデート2 どうやら、スピナーアダプターに新しいアイテムを追加する必要があります。このために、すべてのアイテムのリストを作成し、このリストをアダプタと一緒にダイアログに渡すことができます。ユーザーが文字列を入力して[OK]ボタンを押すと、メソッドはこの文字列をリストに追加し、 UIを更新するためonClickに呼び出します。notifyDataSetChanged

これを追加しMainActivityます:

List<String> spinnerItems;

onCreate

spinnerItems = new ArrayList<String>();
adapter = enw ArrayAdapter<String>(this, 0, spinnerItems);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

パスspinnerItemsadaptershowAlertDialog

alert.showAlertDialog(MainActivity.this, "Enter Item",
     "Please enter the spinner item",
     true, spinnerItems, adapter);

最後に、リストにテキストを追加してアダプタに通知します。

alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        savedinput = input.getText().toString();
        spinnerItems.add(savedInput);
        adapter.notifyDataSetChanged();
    }
});
于 2013-02-01T08:53:32.210 に答える
1

SharedPreferences から次のように最新の値を取得するには、onCreate の代わりにボタン クリックで最新の値を取得する必要があります。

addbutton.setOnClickListener(new View.OnClickListener() {

        @Override
         public void onClick(View v) {
           AlertDialogManager alert = new AlertDialogManager();

           alert.showAlertDialog(MainActivity.this, "Enter Item",
                        "Please enter the spinner item",
                        true);
           savedinput=  prefs.getString("KEY_SAVEDINPUT",""); //<<< get value here
           System.out.println("main : " +savedinput);

       }   

   });

または、Activity の onResume から値を取得しようとします。

于 2013-02-01T08:48:53.787 に答える
0

これ

savedinput = input.getText().toString();

実行時に評価されます。あなたが電話するときではありませんgetItem()。得られる値は、この場合、アラートが表示される前の値です。

同じロジックが

savedinput=  prefs.getString("KEY_SAVEDINPUT","");
于 2013-02-01T08:51:40.593 に答える