0

我是Android和Java的新手,我試圖開發一個需要多個活動的應用程序。如何從AndroidStudio上的多個活動傳輸數據?

第一個活動是主菜單,第二個是鬧鐘,第三個是設置。

問題是我想從第一個開始第二個活動,但我想檢查密碼以停止第三個的警報。

我檢查了很多教程,看來我需要將第三個活動中的數據發送到第二個,但是當我在第一個創建第二個時,我不知道如何獲取「意向」對象發送數據,如果我使用相同的引用創建另一個,它會崩潰。

我已經嘗試從第一個到第三個活動發送第二個intend,但我不知道如何接收它,因爲它既不是String,Int ...也不能做「bundle.getString」。

正如你可能看到我有點困惑,它可能比我想象的更容易。我會感謝你的回答。

第一個活動(主):

package com.example.robert.savemob; 

import android.support.v7.app.AppCompatActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 

public class Main extends AppCompatActivity { 

    Intent i1; 
    Intent i2; 

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

     i1 = new Intent(this, Alarma.class); 
     i2 = new Intent(this, Opciones.class); 
    } 

    public void Alarm(View view) { 
     startActivity(i1); 
    } 
    public void Settings(View view) { 
     startActivity(i2); 
    } 
} 

次活動(Alarma)

package com.example.robert.savemob; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Alarma extends AppCompatActivity { 

    private EditText et1; 
    String clavecorrecta; 

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

     et1=(EditText)findViewById(R.id.et1); 
     Bundle bundle = getIntent().getExtras(); 
     clavecorrecta = bundle.getString("clavecorrecta"); 
    } 

    public void Parar(View v) { 
     String clave=et1.getText().toString(); 
     if (clave.length()==0) { 
      Toast notificacion= Toast.makeText(this,"Introduce la clave", Toast.LENGTH_LONG); 
      notificacion.show(); 
     } 
     else if (clave.equals(clavecorrecta)) { 
      finish(); 
     } 
     else { 
      Toast notificacion= Toast.makeText(this,"Clave incorrecta", Toast.LENGTH_LONG); 
      notificacion.show(); 
     } 
    } 
} 

第三個活動(Opciones)

package com.example.robert.savemob; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.EditText; 

public class Opciones extends AppCompatActivity { 

    private EditText et2; 

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

     et2=(EditText)findViewById(R.id.et2); 

     i1.putExtra("clavecorrecta", et2.getText().toString()); //I want to send it but can't acces to that i1 
    } 

} 

回答

0

你可以這樣做。在你的Opciones活動中,聲明一個靜態的String變量。將EditText數據存儲到字符串中,您可以引用第二個活動的字符串。

第三個活動

public static String claveCorrecta = ""; 
claveCorrecta = et2.getText.toString(); 

現在,在第二個活動,你可以通過

Opciones.claveCorrecta 
1

根據您需要共享的數據,您可以在活動之間發送捆綁包,使用共享首選項或實現您自己的單數據類與共享數據所有的應用程序之間。 當我需要分享它需要在應用程序的不同的活動,任何一點被稱爲數據,我更喜歡單是這樣的:

public class AppData { 

    private static AppData ourInstance = new AppData(); 

    private String deviceId = null; // Device 
    private String coupon = null; // Coupon used to chack a valid event 



    public static AppData getInstance() { 
     return ourInstance; 
    } 

} 

而像使用:

AppData.getInstance().deviceId = "sample device Id"; 

如果您需要在分立的方式從一個實例發送信息到另一個:

  1. 從源活動是這樣的:

    private void switchToLoginActivity(int errorCode){ Intent intent = new Intent(this,LoginActivity.class);

    Bundle bundle = new Bundle(); 
    bundle.putInt (Commons.LOGIN_SHOW_MESSAGE, errorCode); 
    
    intent.putExtras(bundle); 
    startActivity(intent); 
    overridePendingTransition(R.anim.left_to_right_in, R.anim.left_to_right_out); 
    finish(); 
    

    }

  2. 在您需要獲得數據的目標活動所收到的:

    公共無效的onCreate(捆綁savedInstanceState){ 超。的onCreate(savedInstanceState);

    getParametersFromIntent(); 
    

    }

    私人無效getParametersFromIntent(){

    Bundle bundle = getIntent().getExtras(); 
    
    if (bundle != null) { 
    
        if (bundle.containsKey(Commons.LOGIN_SHOW_MESSAGE)) { 
         showMessage = bundle.getInt (Commons.LOGIN_SHOW_MESSAGE); 
        } 
    
    } 
    

    }

希望它能幫助。

0

引用字符串您可以發送原始類型以及POJO對象等活動。要發送任何POJO您必須實施SerializableParcellable

例如,將數據發送到次活動做這樣的事情:

Intent intent = new Intent(context, SingleFragmentHostActivity.class); 
    Bundle extras = new Bundle(); 
    extras.putString("key_title", "Title"); 
    extras.putSerializable("pojo", new Car()); // Car class must implemente Serializable 
    intent.putExtras(extras); 
    startActivity(intent); 

如果你想獲得一些數據,從第二個活動回來,你將不得不使用startActiivtyForResult而不是startActivity這樣的:

public final static int REQUEST_CODE = 0001; // integer of your choice 

    startActivityForResult(intent, REQUEST_CODE); 

然後,您必須在調用startActivityForResult的活動中覆蓋onActivityResult方法。事情是這樣的:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == REQUEST_CODE) { 
     if(resultCode == RESULT_OK) { 
      if(data != null && data.getExtras() != null) {  
       data.getExtras().getBoolean("key_is_success", false) 
      } 
     } else if(resultCoee == RESULT_CANEL){ 
      // Your logic in case user cancelled the operation or something. 
     } 
    } 
} 

例如從第二個活動要發送一個布爾值回的第一項活動。你可以做這樣的事情:

Intent intent = new Intent(); 
    intent.putExtra("key_is_success", true); 
    setResult(RESULT_OK, intent); 
    finish(); 

同樣的邏輯也適用,如果你想發送一些數據,從第三個活動到第二個活動和第2活動後面會發回的第一項活動。

從第二活動啓動第三活動時,您也可以使用Intent.FLAG_ACTIVITY_FORWARD_RESULT。根據文檔:

如果已設置並且此意圖正用於從現有活動啓動新活動,則將現有活動的回覆目標轉移到新活動。這樣新的活動可以調用setResult(int)並將該結果發送回原始活動的回覆目標。

閱讀此鏈接查看更多細節: https://developer.android.com/training/basics/intents/result.html

我希望它可以幫助你。乾杯!

相關問題