2009-07-14 32 views
86

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ách chuyển giá trị từ một hoạt động sang hoạt động trước

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 TextView và một nút và hoạt động thứ hai có một EditText và 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 nội dung nào đó 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à sẽ được hiển thị trong hoạt động đầu tiên TextView.

Trả lời

211

Để nắm bắt các tác vụ được thực hiện trên một Hoạt động trong một Hoạt động khác, yêu cầu ba bước.

Khởi chạy Hoạt động phụ (hoạt động 'Chỉnh sửa văn bản') dưới dạng hoạt động phụ bằng cách sử dụng startActivityForResult từ 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 Mục đích mới và bao gồm giá trị văn bản đã nhập trong gói phụ của nó. Để chuyển lại cho cuộc gọi phụ huynh setResult trướ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à gọi đến Hoạt động: Ghi đè onActivityResult để nghe gọi lại từ hoạt động nhập văn bản. Nhận thêm từ Mục đích đã trả về để lấy giá trị văn bản 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 làm việc cho tôi ngoại trừ 'Mục đích mới (null);' là "quá mơ hồ" và tôi đã phải thay đổi nó thành 'Mục đích mới'(); ' –

+0

Điều này thật tuyệt vời: D –

+0

Điều đáng chú ý là đ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 đoạn, nó sẽ không hoạt động vì mã requestCode sẽ khác nhau mỗi lần. Bạn sẽ cần sử dụng hàm getActivity(). StartActivityForResult() trong đoạn. – stef

5

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

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

Intent retData=new Intent(); 

Thêm dữ liệu để vượt qua trở lại

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

đi trước với setResult

setResult(RESULT_OK, retData); 

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

finish(); 
+0

Thiếu dấu ngoặc kép ở dòng thứ hai của mã. Dấu hoa thị? – JohnK

2

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

Bằng cách này, tôi có thể thay đổi 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 phát hành của nhiều bản sao của cùng một hoạt động (lớp) trong ứng dụng, nhưng tôi thấy điều này là dễ thực hiện nhất, và tôi sử dụng nó nhiều nhất.

+0

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

9

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

A. Cơ sở dữ liệu

B. tùy chọn được chia sẻ.

C. Nối tiếp đố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 ý định và giao diện linh hoạt.

Tùy thuộc vào nhu cầu của dự án của bạn.

A. Cơ sở dữ liệu

SQLite là một cơ sở dữ liệu mã 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ệ chuẩn như cú pháp SQL, các 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. Shared Preferences

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 Key Tên người dùng, Giá trị Giá trị.

Làm thế nào để 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ể tiết kiệm dtatype mong muốn của bạn.

Làm thế nào để lấy

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

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

C. Object Serialization

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

đậu Sử dụng java và lưu trữ trong nó là một trong những lĩnh vực của mình và thu khí sử dụng và setter cho rằng

JavaBeans là lớp Java có tài sản. Hãy suy nghĩ về các thuộc tính làm các biến cá thể riêng tư. 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 học của chúng 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 lục 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 quý vị gửi phương pháp bằng cách sử dụng

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

Sau đó sử dụng đối tượng Serialzation serialize đối tượng này và trong deserialize lớp khác của bạn đố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 chuỗi các byte bao gồm dữ liệu của đối tượng cũng như thông tin về loại đối tượng và loại dữ liệu được lưu trữ trong đối tượng.

Sau khi một đối tượng được tuần tự đã được ghi vào một tệp, nó có thể được đọc từ tệp và deserialized, thông tin loại 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 này tham khảo liên kết này

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

Get variable in other classes

D. CommonUtilities

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

mẫu

public class CommonUtilities { 

    public static String className = "CommonUtilities"; 

} 

E. Đi qua dữ liệu thông qua Intents

Vui lòng tham khảo hướng dẫn này cho tùy chọn này truyền dữ liệu.

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

0

Cách tốt nhất để làm ở đây là đặt biến để một lớp thông thường đượ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 vv ...)

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ã số

@Override public void onActivityResult (int requestCode, int resultCode, dữ liệu Ý định) { 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); 
.... 
Các vấn đề liên quan