2014-11-08 62 views
1

我有一個即將到來的問題是心靈在這個時候關於android應用程序開發的衝刺。如何發送數據從一個活動到另一個沒有創建一個新的意圖Android

在我的應用程序,它的工作方式我想要它,除了一部分我有問題搞清楚是我將如何發送一個數據從一個活動到另一個沒有作出新的意圖。

在我的代碼中,用戶輸入他的名字,質量和高度,當用戶點擊按鈕計算時,它將新的意圖中的所有值都帶到第二個活動,在那裏,它計算出BMI用戶。 現在,我想這個新鮮計算BMI發回的第一個活動,而無需創建一個新的意圖,但我現在如何去說

確定這裏是我的代碼的相關部分

主要Activity.java

package mobileapp.melvin.bmicalculator; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.os.Bundle; 
import android.view.*; 
import android.content.*; 
import android.widget.*; 

public class MainActivity extends Activity { 

public String name,mass,height,bmi; 
public EditText nameField, massField, heightField; 

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


    bmi = getIntent().getStringExtra("BMI"); 

    //Create "TextFields" By getting ID of Editviews from Main XML 
    nameField = (EditText) findViewById(R.id.mText_box1); 
    massField = (EditText) findViewById(R.id.mText_box2); 
    heightField = (EditText) findViewById(R.id.mText_box3); 

    //Button To calculate and display BMI as TextViews 
    Button launchBtn = (Button) findViewById(R.id.mButton_calculate); 
    launchBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      //Check is The "Textfields" have values 
      if(!verifyData()){ 
       return; 
      } 
      /*Create a new Intent to Launch another activity 
      * To display all the Values gotten from 
      * The TextFields as Normal Text Values 
      */ 
      Intent launcher = new Intent(v.getContext(),BMI1.class); 
      //This intent then passes these values over to the next Intent 
      launcher.putExtra("Name", name); 
      launcher.putExtra("Mass", mass); 
      launcher.putExtra("Height", height); 
      //We then start this new activity with the new Intent 
      startActivity(launcher); 
     } 
    }); 
} 

BMI1.java

package mobileapp.melvin.bmicalculator; 

import android.app.*; 
import android.content.*; 
import android.os.*; 
import android.view.*; 
import android.widget.*; 

public class BMI1 extends Activity { 

String name,mass,height,bmi; 

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

    //Get data from the first activity through intent 
    name = getIntent().getStringExtra("Name"); 
    mass = getIntent().getStringExtra("Mass"); 
    height = getIntent().getStringExtra("Height"); 

    //convert mass and height to double and calculate BMI 
    double m = Double.parseDouble(mass); 
    double h = Double.parseDouble(height); 
    bmi = Double.toString(calculateBMI(m, h)); 

    ((TextView) findViewById(R.id.b1_Label2)).setText(name); 
    ((TextView) findViewById(R.id.b1_Label4)).setText(mass); 
    ((TextView) findViewById(R.id.b1_Label6)).setText(height); 
    ((TextView) findViewById(R.id.b1_Label8)).setText(bmi); 


    Button backBtn = (Button) findViewById(R.id.b1Button_back); 
    backBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent launcher = getIntent(); 
      launcher.putExtra("BMI", bmi); 
      finish(); 
     } 
    }); 
} 

    private double calculateBMI(double toMass, double toHeight){ 
     double value; 

     value = toMass/(toHeight * toHeight); 
     return value; 
    } 

} 

我知道沒有值傳遞,因爲當用戶在第一個Activity中點擊Display時,它會將值顯示到第三個Activity,其中textView應該顯示例如「BMI:20.66」但代之以「BMI :null「,我將如何解決這個錯誤?

+0

不使用任何SharedPreferences/SD卡文件等,使用startActivityForResult()模式 – pskink 2014-11-08 19:30:59

+0

是啊,我只是在搜索@Deminem發佈之前他做了一個編輯,我發現我然後爲我工作 – 2014-11-08 19:37:03

+0

@ProgrammingNewb - 如果這解決你的問題,然後接受幫助社區的答案。快樂的編碼! – Deminem 2014-11-08 20:04:57

回答

1

妥善解決上述問題,Android提供startActivityForResult,基本上推出針對你想要的結果,當它完成了一個活動。

例如,這裏是如何開始的活動,允許用戶選擇一個聯繫人:

static final int PICK_CONTACT_REQUEST = 1; // The request code 
... 
private void pickContact() { 
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); 
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers 
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); 
} 

收到結果

當用戶與後續活動並返回完成,系統會調用您的活動的方法onActivityResult()。此方法包含三個參數:

  • 您傳遞給startActivityForResult()的請求代碼。
  • 由第二個活動指定的結果代碼。如果操作成功,這可以是RESULT_OKRESULT_CANCELED如果用戶退出或由於某種原因操作失敗。
  • 載入結果數據的Intent

例如,這裏是你如何處理的結果「選擇聯繫人」的意圖:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
    if (requestCode == PICK_CONTACT_REQUEST) { 
     // Make sure the request was successful 
     if (resultCode == RESULT_OK) { 
      // The user picked a contact. 
      // The Intent's data Uri identifies which contact was selected. 

      // Do something with the contact here (bigger example below) 
     } 
    } 
} 

你可以看到這篇文章herestartActivityForResult完整的例子。

+0

您的編輯工作之前我的工作,我想知道你爲什麼改變它:3 – 2014-11-08 19:37:31

+0

兩個鏈接仍然工作。我更新了我的答案,給你一個它如何工作的例子。 – Deminem 2014-11-08 19:57:43

+1

ja,我沒有看到第二個鏈接,第二個鏈接非常有幫助:3 – 2014-11-08 20:07:07

1

要在Activity之間發送數據而不使用Intent,可以使用SharedPreferences或SQlite db。

爲SharedPreferences

例子:

// Create object of SharedPreferences. 
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
//now get Editor 
SharedPreferences.Editor editor = sharedPref.edit(); 
//put your value 
editor.putString("userName", "stackoverlow"); 

//commits your edits 
editor.commit(); 

使用putString(),putBoolean(),putInt(),putFloat(),putLong(),您可以保存所需的dtatype。

,並獲取數據:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
String userName = sharedPref.getString("userName", "Not Available"); 
2

您不必總是使用意向活動之間發送數據。您可以使用其他Android存儲選項,如Sqlite db,SharedPreferences。您也可以將數據存儲在SDcard中。看看Android的存儲選項 here

相關問題