无法将String值从一个java类传递给另一个java类

时间:2014-06-05 07:16:39

标签: java android sqlite android-activity

我正在尝试发送从微调器访问的字符串的值,并将其发送到数据助手类以运行查询并在另一个在另一个活动上运行的微调器中插入值

获取字符串值

的类内部方法

NewTask.java

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {

     // On selecting a spinner item
     label = spinnerComp.getSelectedItem().toString(); //storing value of spinner in string label
     System.out.println("NewTask label="+label);

     toRetDeptString();   //it will call return string method


    // Showing selected spinner item
    Toast.makeText(spinnerComp.getContext(), "You selected: " + label,
            Toast.LENGTH_LONG).show();
}

现在返回字符串方法也是在NewTask.java中声明的

    public String toRetDeptString() {
    System.out.println("NewTask String label="+label);
    return label;
  }

现在我正在尝试访问标签字符串dataHelper类的值,该类根据字符串标签内的值运行查询

DataHelper.java内部 并在DatabaseHelper类中

    public List<String> getAllLabelsDept(){

           NewTask a = new NewTask();
           String n1= a.toRetDeptString();  //this one doesn't worked

               // String n1 = a.label;  //this one doesn't worked

         //  String n1="umbrella";  //this method worked by directly assiging string value
           System.out.println("a="+n1);
            List<String> labels = new ArrayList<String>();


            //  Query
            String selectQuery = "select  " + Dept + " from "+TABLE_NAME +" where " + Comp + " = '" + n1 +"'";

            SQLiteDatabase db1 = this.getReadableDatabase();
            Cursor cursor = db1.rawQuery(selectQuery, null);

            // looping through all rows and adding to list
            if (cursor.moveToFirst()) {
                do {
                    labels.add(cursor.getString(cursor.getColumnIndex(Dept)));
                } while (cursor.moveToNext());
            }

            // closing connection
            cursor.close();
            db1.close();

            // returning lables
            return labels;
        }

Select_Dept.java

  public class Select_Dept extends Activity implements OnItemSelectedListener{
Spinner spinnerDept;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select__dept);

    spinnerDept = (Spinner) findViewById(R.id.spinnerDept);
    spinnerDept.setOnItemSelectedListener(this);
    loadSpinnerDataDept();
}

private void loadSpinnerDataDept() {
    // database handler
    DatabaseHelper db = new DatabaseHelper(getApplicationContext());

    // Spinner Drop down elements
    List<String> lables = db.getAllLabelsDept();

    // Creating adapter for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, lables);

    // Drop down layout style - list view with radio button
    dataAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    spinnerDept.setAdapter(dataAdapter);
}

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {

     // On selecting a spinner item
     String label = spinnerDept.getSelectedItem().toString();

    // Showing selected spinner item
    Toast.makeText(spinnerDept.getContext(), "You selected: " + label,
            Toast.LENGTH_LONG).show();
}

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

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

}

 }

Logcat的输出: -

 - 06-05 12:30:13.369: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.EzyCloud.ezytask/.MainActivity }
 - 06-05 12:30:14.160: I/ActivityManager(59): Displayed activity com.EzyCloud.ezytask/.MainActivity: 562 ms (total 562 ms)
06-05 12:30:16.139: I/ActivityManager(59): Starting activity: Intent { cmp=com.EzyCloud.ezytask/.NewTask }
 - 06-05 12:30:16.299: I/System.out(280): NewTask label=umbrella
 - 06-05 12:30:16.299: I/System.out(280): NewTask String label=umbrella
 - 06-05 12:30:16.559: I/ActivityManager(59): Displayed activity com.EzyCloud.ezytask/.NewTask: 406 ms (total 406 ms)
 - 06-05 12:30:19.140: I/ActivityManager(59): Starting activity: Intent { cmp=com.EzyCloud.ezytask/.Select_Dept }
 - 06-05 12:30:19.339: I/System.out(280): NewTask String label= //no value accesed
 - 06-05 12:30:19.339: I/System.out(280): a=                     **//no value accesed**
 - 06-05 12:30:19.699: I/ActivityManager(59): Displayed activity  - com.EzyCloud.ezytask/.Select_Dept: 508 ms (total 508 ms)
 - 06-05 12:30:24.849: D/dalvikvm(128): GC_EXPLICIT freed 202 objects / 9800 bytes in 145ms

但由于某些问题,字符串的值未加入

3 个答案:

答案 0 :(得分:2)

NewTask.java中,您将自己范围内的toRetDeptString()称为默认对象。

DataHelper.java中,您正在创建一个新对象并且只是调用该方法。显然字符串是空的。

要将字符串数据传递给其他活动,您可以尝试使用intents。 否则,您必须将值设置为模型对象,并将对象引用本身传递给下一个活动,而不是创建新对象并访问该方法。

答案 1 :(得分:0)

不幸的是,您不能通过简单地使用相同的字段来分享意图中的数据。

处理这种情况的一种方法是使用全局单例类来保存您的值。

另一种是按照下面的方式传递数据。

在微调器A的活动中创建一个意图:

/* Instead of FromActivity.this you can also use getApplicationContext() */
Intent intent = new Intent(FromActivity.this, ToActivity.class);
intent.putExtra("label", label);
startActivity(intent);

然后在其他微调器的活动中,您可以检索它们:

Bundle extras = getIntent().getExtras(); 
if (extras !=null) {
    String value = extras.getString("label");
}
System.out.println("NewTask label = " + label);

请注意,通过此方法传递值有一些数据大小限制,但在您的特定情况下应该有效。

我没有声称完全相同的代码可以在您的应用程序中运行,但概念本身应该。

Further reading

希望它有所帮助。

答案 2 :(得分:0)

首先,当你得到&#34; System.out(280):NewTask String label = //没有加入值&#34; ,NewTask实例并没有在堆栈顶部。 其次,变量标签是私有变量,因此可能不存在。

如果你想获得标签,你可以使用&#34;静态&#34; ,例子&#34;公共静态标签; &#34; ,但我不建议你这样做,因为这很危险。

最后,您可以构建一个自定义的Application类和&#34;私有String标签;&#34; **强文**用于记录标签(整体)或通过意图传递标签。