2013-02-01 47 views
1

在我的主类中,我有一个按钮来调用一个显示带有edittext对话框的类。我的问题是这样的 - 主要活动在第一次运行时没有获得edittext值,如果我第二次运行它,我会得到旧的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 
+0

其中u没有获得价值? –

+0

我没有从类中获取主要活动的值,类本身正在获取值为字符串 –

回答

3

您在这里有几个问题。

  1. 你不应该阅读onCreatesavedValue,你应该这样做,只有当你使用它。请参阅@ρяσѕρєя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按钮onClick方法添加此字符串列表并调用notifyDataSetChanged更新UI:

添加这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(); 
    } 
}); 
+0

嗨,但是我们可以从SharedPreferences中获得最新的价值活动 –

+1

@ρяσѕρєяK是的,这是一个选项。我的观点是,在显示对话框后不应该立即调用它。 –

+0

我已经尝试了很多东西......我怎么能做到这一点? –

1

,您将需要得到下旬在按钮的点击,而不是的onCreate ST值从SharedPreferences为获得最新的值:

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

     } 

    }); 

,或者你会尝试从的onResume获得活动的价值

+0

这不会帮助我,我应该尝试线程概念,只是为了解决此问题? –

+0

@ agen451:你可以做更多的技巧在AlertDialogManager中声明savedinput作为public static String savedinput然后尝试获取值并检查你是否得到最新的 –

+0

我的主要活动总是在实际获得它之前的字符串... –

0

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

进行评估时,运行。不是当你拨打getItem()。在显示警报之前,您将得到的值就是这种情况。

同样的逻辑也适用于

savedinput= prefs.getString("KEY_SAVEDINPUT",""); 
+0

我很高兴你的问题得到了解决。有什么方法可以同时从课堂上获得价值吗? –