Cách chuyển các giá trị từ một hoạt động sang hoạt động trước đó


97

Làm cách nào để chuyển một giá trị từ một màn hình sang màn hình trước của nó?

Hãy xem xét trường hợp này: Tôi có hai hoạt động. Màn hình đầu tiên có một TextViewvà một nút và hoạt động thứ hai có một EditTextvà một nút.

Nếu tôi nhấp vào nút đầu tiên thì nó phải chuyển sang hoạt động thứ hai và ở đây người dùng phải nhập một cái gì đó vào hộp văn bản. Nếu anh ta nhấn nút từ màn hình thứ hai thì các giá trị từ hộp văn bản sẽ chuyển sang hoạt động đầu tiên và giá trị đó sẽ được hiển thị trong hoạt động đầu tiên TextView.



Câu trả lời:


241

Để nắm bắt các hành động được thực hiện trên một Hoạt động trong một hoạt động khác, cần ba bước.

Khởi chạy Hoạt động phụ (Hoạt động 'Chỉnh sửa văn bản' của bạn) dưới dạng hoạt động phụ bằng cách sử dụng startActivityForResulttừ Hoạt động chính của bạn.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Trong hoạt động phụ, thay vì chỉ đóng Hoạt động khi người dùng nhấp vào nút, bạn cần tạo Ý định mới và bao gồm giá trị văn bản đã nhập trong gói phần bổ sung của nó. Để chuyển nó trở lại cuộc gọi cha setResulttrước khi gọi finishđể đóng Hoạt động phụ.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

Bước cuối cùng là trong Activity gọi: Ghi đè onActivityResultđể lắng nghe các cuộc gọi lại từ Activity nhập văn bản. Nhận thêm từ Intent được trả lại để nhận giá trị văn bản mà bạn sẽ hiển thị.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 

27
Tất cả điều này đều hiệu quả với tôi ngoại trừ new Intent(null);là "quá mơ hồ" và tôi phải thay đổi nó thành new Intent();.
Richard Tingle

1
Cũng cần lưu ý rằng điều này sẽ chỉ hoạt động trong cùng một ngữ cảnh. Ví dụ: nếu bạn bắt đầu hoạt động từ một phân đoạn, nó sẽ không hoạt động vì Mã yêu cầu sẽ khác nhau mỗi lần. Bạn sẽ cần sử dụng getActivity (). StartActivityForResult () trong phân đoạn.
stef

10

Có một số cách mà bạn có thể truy cập các biến hoặc đối tượng trong các lớp hoặc Hoạt động khác.

Một cơ sở dữ liệu

B. sở thích chung.

C. Tuần tự hóa đối tượng.

D. Một lớp có thể chứa dữ liệu chung có thể được đặt tên là Tiện ích chung, tùy thuộc vào bạn.

E. Truyền dữ liệu thông qua Intents và Parcelable Interface.

Nó phụ thuộc vào nhu cầu dự án của bạn.

A. Cơ sở dữ liệu

SQLite là Cơ sở dữ liệu nguồn mở được nhúng vào Android. SQLite hỗ trợ các tính năng cơ sở dữ liệu quan hệ tiêu chuẩn như cú pháp SQL, giao dịch và các câu lệnh chuẩn bị.

Hướng dẫn - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Sở thích Chia sẻ

Giả sử bạn muốn lưu trữ tên người dùng. Vì vậy, bây giờ sẽ có hai điều là Tên người dùng chính , Giá trị giá trị.

Cách lưu trữ

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

Sử dụng putString (), putBoolean (), putInt (), putFloat (), putLong (), bạn có thể lưu dtatype mong muốn của mình.

Làm thế nào để tìm nạp

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

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Tuần tự hóa đối tượng

Đối tượng serzation được sử dụng nếu chúng ta muốn lưu một trạng thái đối tượng để gửi nó qua mạng hoặc bạn cũng có thể sử dụng nó cho mục đích của mình.

Sử dụng đậu java và lưu trữ trong đó như một trong các lĩnh vực của anh ấy và sử dụng getters và setter cho điều đó

JavaBeans là các lớp Java có các thuộc tính. Hãy coi thuộc tính như các biến cá thể riêng. Vì chúng là riêng tư, cách duy nhất chúng có thể được truy cập từ bên ngoài lớp của chúng là thông qua các phương thức trong lớp. Các phương thức thay đổi giá trị của thuộc tính được gọi là phương thức setter và các phương thức truy xuất giá trị của thuộc tính được gọi là phương thức getter.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Đặt biến trong phương thức thư của bạn bằng cách sử dụng

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Sau đó, sử dụng tuần tự hóa đối tượng để tuần tự hóa đối tượng này và trong lớp khác của bạn giải mã hóa đối tượng này.

Trong tuần tự hóa, một đối tượng có thể được biểu diễn dưới dạng một chuỗi các byte bao gồm dữ liệu của đối tượng cũng như thông tin về kiểu của đối tượng và các kiểu dữ liệu được lưu trữ trong đối tượng.

Sau khi một đối tượng tuần tự hóa đã được ghi vào một tệp, nó có thể được đọc từ tệp và được giải mã hóa, thông tin kiểu và byte đại diện cho đối tượng và dữ liệu của nó có thể được sử dụng để tạo lại đối tượng trong bộ nhớ.

Nếu bạn muốn hướng dẫn cho điều này, hãy tham khảo liên kết này

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Nhận biến trong các lớp khác

D. Tiện ích chung

Bạn có thể tự tạo một lớp có thể chứa dữ liệu phổ biến mà bạn thường xuyên cần trong dự án của mình.

Mẫu vật

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Truyền dữ liệu thông qua ý định

Vui lòng tham khảo hướng dẫn này để biết tùy chọn chuyển dữ liệu này.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-actiilities-using-parcelable-classes/


6

bạn không cần phải ...

Chỉ cần gọi newIntent () từ hoạt động thứ hai

Intent retData=new Intent();

Thêm dữ liệu để trả lại

putExtras (retData.putExtra("userName", getUsrName()));

Tiếp tục với setResult

setResult(RESULT_OK, retData);

Và sau đó có thể kết thúc

finish();


2

Tôi thường sử dụng các biến tĩnh trong hoạt động gọi với các phương thức setter tĩnh để thiết lập chúng.

Bằng cách này, tôi có thể thay đổi các giá trị trong bất kỳ hoạt động nào theo ý muốn, bất kể luồng kiểm soát chính xác giữa các hoạt động khác nhau.

Lưu ý rằng thủ thuật này chỉ có thể được sử dụng nếu bạn không quan tâm đến việc khởi tạo nhiều hơn một bản sao của cùng một hoạt động (lớp) trong ứng dụng, nhưng tôi thấy đây là cách dễ thực hiện nhất và tôi sử dụng nó nhiều nhất. .


Không phải là một giải pháp tuyệt vời. Điều này đang đi ngược lại phương pháp hay nhất của Android. Bạn không thể đảm bảo một hoạt động sẽ không bị hủy và một phiên bản mới được hệ thống bắt đầu.
SIr Codealot

0

Cách tốt nhất để làm ở đây là đặt biến vào một lớp chung được định nghĩa bên ngoài phạm vi

public class Utils 
{
    public static String mPosition;
}

bên trong mã của bạn (ví dụ: OnButtonClick, v.v.)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

bên trong mã của

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.