[英]Pass ArrayList Class Object to another fragment using Bundle in Android
[英]Pass ArrayList from fragment to another fragment(extends ListFragment) using bundle, seListAdapter runtime error
我試過將靜態變量用於ArrayList,但在ListFragment類中,在調試時其值為null。
我認為ListFragment是在初始化ArrayList之前創建的,這就是為什么它為null的原因,但不確定。
建議我是否可以使用其他任何方式將膨脹的ArrayList從Fragment類發送到擴展ListFragment的其他Fragment類。
提前致謝。
目標(這是線索,需要做什么)
在Monday_fragment的onStart()方法中,使用findByView()方法在頁面視圖中查找保存輸入按鈕的標簽。 使用對按鈕的引用,將setOnClickListener()方法附加到保存按鈕。 您將需要使用此方法保存頁面上EditText字段中包含的時間和日記輸入字符串。
使用findViewById()還可以獲得對第一個EditText字段的引用,並使用它來獲取該字段的文本作為字符串並將其保存為字符串。 對下一個EditText-日記條目重復此操作。 您將需要一個可公開訪問的變量來存儲一天(星期一..星期五)的引用,日期時間字符串和日記條目字符串。 使用這些字段創建一個新類(diaryLogs)以保存值,並使用一個構造函數(該構造函數采用int(0 Mon,1 Tue,2 Wed等)和兩個字符串作為日期時間和日記條目)來初始化該對象的實例。 由於同一天會有很多輸入,因此請使用ArrayList <diaryLogs>來存儲值。 因為此值將在片段之間共享,所以在MainActivity類中將變量聲明為static。 使用ArrayList的.add()方法將新的diaryLog添加到setOnClickListener()方法中的ArrayList中。 對其他日記頁面片段重復此操作。
monday_list片段由一個ListView和一個用於返回Monday_fragment頁面的按鈕組成。 在monday_list xml文件中創建這些對象。 創建一個擴展ListFragment類的Monday_list_fragment。 在onCreateView()方法inflate()中,monday_list資源。
在onCreate()方法中,您需要提供一個字符串數組作為setListAdapter()方法中列表的源,該列表用於填充頁面上的ListView。 字符串在MainActivity的靜態ListArray變量中。 但是,它們不是必需的格式,您必須解壓縮diaryLog元素才能獲得所需的字符串。 為此,您必須創建一個足夠大的String數組以容納要顯示的字符串。 因為它由日期/時間字符串和日記條目字符串組成,所以每個diaryLog元素將有兩個這樣的字符串。 使用迭代器遍歷ListArray。 將日期字符串和日記字符串字符串復制到本地字符串中。 然后,將此本地字符串用作setListAdapter()的相關參數,以便ListView顯示所需的字符串。
在MainActivity Java文件中添加單擊處理程序,以便單擊“星期一”片段頁面上的“保存日記條目”按鈕,可以使用FragmentManager使Monday_list_fragment可見。 還要在MainActivity中添加一個單擊處理程序,以便單擊“返回星期一日記”按鈕將返回到Monday_fragment頁面。
UPDATE 類MainActivity
public class MainActivity extends Activity {
public static int Monday=0;
/*public static int Tuesday=1;
public static int Wednesday=2;
public static int Thursday=3;
public static int Friday=4;
public static String timeEntry;
public static String entryEntered;*/
// public static ArrayList<String> logs;
//public static String[] entry;
//public static String time;
//public static String text;
//public static String totalEntry;
//public static ArrayList<DiaryLogs> diaryLogs;
//public static ArrayList<DiaryLogs> test;
//public static DiaryLogs[] entryLogs;
//public static ArrayAdapter<DiaryLogs> monAdapter;
//public static ArrayList< String > myStringList;
//public static ArrayList<DiaryLogs> entryLogs;
public static ArrayList<String> myStringList;
public static ArrayList<String> getMyStringList() {
return myStringList;
}
public void setMyStringList(ArrayList<String> myStringList) {
this.myStringList = myStringList;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Home_fragment hf = new Home_fragment();
fragmentTransaction.replace(android.R.id.content, hf);
fragmentTransaction.commit();
setContentView(R.layout.activity_main);
}
public void monClick(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Monday_fragment mf = new Monday_fragment();
fragmentTransaction.replace(android.R.id.content, mf);
fragmentTransaction.commit();
}
public void tuesClick(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Tuesday_fragment tf = new Tuesday_fragment();
fragmentTransaction.replace(android.R.id.content, tf);
fragmentTransaction.commit();
}
public void wedClick(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Wednesday_fragment wf = new Wednesday_fragment();
fragmentTransaction.replace(android.R.id.content, wf);
fragmentTransaction.commit();
}
public void thursClick(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Thursday_fragment thf = new Thursday_fragment();
fragmentTransaction.replace(android.R.id.content, thf);
fragmentTransaction.commit();
}
public void friClick(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Friday_fragment ff = new Friday_fragment();
fragmentTransaction.replace(android.R.id.content, ff);
fragmentTransaction.commit();
}
public void next_Home_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Monday_fragment mf = new Monday_fragment();
fragmentTransaction.replace(android.R.id.content, mf);
fragmentTransaction.commit();
}
public void previous_Home_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Friday_fragment ff = new Friday_fragment();
fragmentTransaction.replace(android.R.id.content, ff);
fragmentTransaction.commit();
}
public void next_Mon_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Tuesday_fragment tf = new Tuesday_fragment();
fragmentTransaction.replace(android.R.id.content, tf);
fragmentTransaction.commit();
}
public void previous_Mon_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Friday_fragment ff = new Friday_fragment();
fragmentTransaction.replace(android.R.id.content, ff);
fragmentTransaction.commit();
}
public void next_Tues_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Wednesday_fragment wf = new Wednesday_fragment();
fragmentTransaction.replace(android.R.id.content, wf);
fragmentTransaction.commit();
}
public void previous_Tues_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Monday_fragment mf = new Monday_fragment();
fragmentTransaction.replace(android.R.id.content, mf);
fragmentTransaction.commit();
}
public void next_Wed_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Thursday_fragment thf = new Thursday_fragment();
fragmentTransaction.replace(android.R.id.content, thf);
fragmentTransaction.commit();
}
public void previous_Wed_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Tuesday_fragment tf = new Tuesday_fragment();
fragmentTransaction.replace(android.R.id.content, tf);
fragmentTransaction.commit();
}
public void next_Thurs_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Friday_fragment ff = new Friday_fragment();
fragmentTransaction.replace(android.R.id.content, ff);
fragmentTransaction.commit();
}
public void previous_Thurs_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Wednesday_fragment wf = new Wednesday_fragment();
fragmentTransaction.replace(android.R.id.content, wf);
fragmentTransaction.commit();
}
public void next_Fri_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Monday_fragment ff = new Monday_fragment();
fragmentTransaction.replace(android.R.id.content, ff);
fragmentTransaction.commit();
}
public void previous_Fri_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Thursday_fragment wf = new Thursday_fragment();
fragmentTransaction.replace(android.R.id.content, wf);
fragmentTransaction.commit();
}
public void home_Click(View view) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Home_fragment hf = new Home_fragment();
fragmentTransaction.replace(android.R.id.content, hf);
fragmentTransaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_profile:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Profile_fragment pf = new Profile_fragment();
fragmentTransaction.replace(android.R.id.content, pf);
fragmentTransaction.commit();
break;
case R.id.action_saveEntries:
break;
case R.id.action_sendAllEntries:
//call delete dialog
deleteDialog();
break;
}
return false;
}
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher)
.setTitle("Save entries to DB first?")
.setNegativeButton("No", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
// if no, close app
MainActivity.this.finish();
}
})
.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
// if ok, save entries to Database
}
})
.create().show();
}
public void deleteDialog() {
new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher)
.setTitle("Are you sure? This will delete all entries.")
.setNegativeButton(android.R.string.cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.create().show();
}
}
自定義對象類DiaryLogs
public class DiaryLogs {
//public static ArrayList<DiaryLogs> entryLogs;
String timeEntry, entryEntered;
int day;
// single constructor that takes an integer and two string
public DiaryLogs(int day, String timeEntry, String entryEntered) {
super();
this.day = day;
this.timeEntry = timeEntry;
this.entryEntered = entryEntered;
}
public String getTimeEntry() {
return timeEntry;
}
public void setTimeEntry(String timeEntry) {
this.timeEntry = timeEntry;
}
public String getEntryEntered() {
return entryEntered;
}
public void setEntryEntered(String entryEntered) {
this.entryEntered = entryEntered;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.timeEntry + "\n" + this.entryEntered;
}
}
UPDATE 類Monday_fragment
public class Monday_fragment extends Fragment {
//public ArrayList<String> myStringList;
Bundle bundle;
ArrayList<DiaryLogs> entryLogs;
EditText timeText;
EditText entryText;
DiaryLogs dl;
String timeEntry;
String entryEntered;
ArrayList<String> myStringList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.monday_fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
currentDateTime();
super.onViewCreated(view, savedInstanceState);
}
public void currentDateTime() {
EditText timeText = (EditText) getView().findViewById(
R.id.dateTimeEText);
SimpleDateFormat df = new SimpleDateFormat("d/M/yyyy:H:m");
String dateTime = df.format(Calendar.getInstance().getTime());
timeText.setText(dateTime);
}
/*public ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs) {
ArrayList<String> stringList = new ArrayList<String>();
for (DiaryLogs myobj : entryLogs) {
stringList.add(myobj.toString());
}
return stringList;
}*/
public ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs) {
ArrayList<String> stringList = MainActivity.getMyStringList();
for (DiaryLogs myobj : entryLogs) {
String objctString = myobj.toString();
stringList.add(objctString);
}
((MainActivity)getActivity()).setMyStringList(stringList);
return stringList;
}
@Override
public void onStart() {
entryLogs = new ArrayList<DiaryLogs>();
timeText = (EditText) getView().findViewById(R.id.dateTimeEText);
entryText = (EditText) getView().findViewById(R.id.diaryEntryEText);
Button saveBtn = (Button) getView()
.findViewById(R.id.saveDiaryEntryBtn);
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
timeEntry = timeText.getText().toString();
entryEntered = entryText.getText().toString();
dl = new DiaryLogs(1, timeEntry, entryEntered);
entryLogs.add(dl);
//convert entryLogs to string array list
//myStringList = toStringList(entryLogs);
myStringList= MainActivity.getMyStringList();
myStringList = toStringList(entryLogs);
//myStringList.addAll(toStringList(entryLogs));
Toast.makeText(getActivity(), "Entry added \n" + dl,
Toast.LENGTH_SHORT).show();
entryText.setText("");
}
}
);
System.out.println(entryLogs);
Button showBtn = (Button) getView().findViewById(
R.id.showDiaryEntriesBtn);
showBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (myStringList != null) {
bundle = new Bundle();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Monday_list_fragment mlf = new Monday_list_fragment();
bundle.putStringArrayList("list", myStringList);
mlf.setArguments(bundle);
fragmentTransaction.replace(android.R.id.content, mlf);
fragmentTransaction.commit();
}
if (myStringList == null) {
Toast.makeText(getActivity(),
"No entry have been added yet", Toast.LENGTH_SHORT)
.show();
}
}
});
super.onStart();
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
班級Monday_list_fragment
public class Monday_list_fragment extends ListFragment {
ArrayList<String> test;
Bundle bundle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bundle = getArguments();
System.out.println(bundle);
//test = bundle.getStringArrayList("list");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater
.inflate(R.layout.monday_list_fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
/* ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, test);
// once adapter set throws runtime error
setListAdapter(adapter);*/
}
}
當對象為Parcelable
或Serializable
時,只能通過Bundle(or Intent)
傳遞自定義對象或自定義對象的ArrayList。 如果您的片段處於同一活動中,那么還有另一件事,那就是為什么要傳遞數組。 您只需在Activity
為列表創建getter
和setter
,然后像在listFragment中的((Activity)getActivity).getArraylist()
一樣訪問它們。 要創建Parcelable
對象,請執行以下操作。
import android.os.Parcel;
import android.os.Parcelable;
public class Address implements Parcelable {
private String name, address, city, state, phone, zip;
@Override
public int describeContents() {
return 0;
}
/*
THE ORDER YOU READ OBJECT FROM AND WRITE OBJECTS TO YOUR PARCEL MUST BE THE SAME
*/
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(address);
parcel.writeString(city);
parcel.writeString(state);
parcel.writeString(phone);
parcel.writeString(zip);
}
public Address(Parcel p){
name = p.readString();
address = p.readString();
city = p.readString();
state = p.readString();
phone = p.readString();
zip = p.readString();
}
// THIS IS ALSO NECESSARY
public static final Creator<Address> CREATOR = new Creator<Address>() {
@Override
public Address createFromParcel(Parcel parcel) {
return new Address(parcel);
}
@Override
public Address[] newArray(int i) {
return new Address[0];
}
};
}
我已經看到了您給定鏈接的代碼,這就是為什么我要發布新的Ans。 一件事,如果您仔細閱讀代碼,便在Monday_fragment
聲明了ArrayAdapter<String>
,因此每次將此片段替換為另一個片段時,此列表都會初始化。 因此,只需在MainActivity
創建一個ArrayAdapter<String>
,然后將其getter, setter
為getter, setter
然后在Monday_fragment
方法ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs)
更改為ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs)
,如下所示
public ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs) {
ArrayList<String> stringList = ((MainActivity)getActivity()).getMyStringList();
for (DiaryLogs myobj : entryLogs) {
String objctString = myobj.toString();
stringList.add(objctString);
}
((MainActivity)getActivity()).setMyStringList(stringList);
return stringList;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.