[英]How to pass a bundle of a LinkedHashMap FROM Fragment back to its Activity
[英]How to pass array list of data from fragment back to its Activity
我有一個活動,我啟動了一個片段以選擇一些列表,選擇之后,我想獲得片段中所選事物的列表。
我用了onActivityResult()
... !! 但這不起作用!
請幫忙!
這是我的活動代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private RecyclerView foldersRV;
private RecyclerView.Adapter foldersAdapter;
private AppCompatButton addFolderBtn;
private AppCompatTextView hiddenText;
private List<String> selectedFoldersToHide = new ArrayList<>();
private static final int REQ_FOR_FOLDERS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
addFolderBtn = (AppCompatButton) findViewById(R.id.add_folder_btn);
hiddenText = (AppCompatTextView) findViewById(R.id.hidden_text_view);
foldersRV = (RecyclerView) findViewById(R.id.folders_list_recycler_view);
foldersRV.setVisibility(View.GONE);
hiddenText.setVisibility(View.VISIBLE);
addFolderBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_folder_btn:
moveToFragment(new FoldersHiddenFragment(), "Add Folders Fragment");
}
}
private void moveToFragment(Fragment toFragment, String TAG) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG);
if (fragment != null && fragment.isVisible()) {
System.out.println("*** ALREADY there ****");
} else {
transaction.replace(R.id.main, toFragment, TAG);
transaction.addToBackStack(null).commit();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == REQ_FOR_FOLDERS) {
selectedFoldersToHide = data.getStringArrayListExtra("FOLDERS_TO_HIDE");
}
}
}
下面是我的片段代碼:
public class FoldersHiddenFragment extends Fragment {
private View allFoldersView;
private RecyclerView foldersRV;
private RecyclerView.Adapter foldersAdapter;
private AppCompatButton hideFoldersBtn;
private ArrayList<String> selectedFoldersToHide = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
allFoldersView = inflater.inflate(R.layout.folders_hidden_fragment_view, container, false);
initView();
return allFoldersView;
}
private void initView() {
foldersRV = (RecyclerView) allFoldersView.findViewById(R.id.folders_list_recycler_view);
foldersRV.setHasFixedSize(true);
foldersRV.setLayoutManager(new LinearLayoutManager(getActivity()));
MyFiles myFiles = new MyFiles();
foldersAdapter = new FoldersAdapter(getActivity(), myFiles.getAllDirectoriesNames(), new FoldersAdapter.FileInterface() {
@Override
public void getFilesSelected(List<String> folderSelectedList) {
selectedFoldersToHide = (ArrayList<String>) folderSelectedList;
}
});
foldersRV.setAdapter(foldersAdapter);
foldersAdapter.notifyDataSetChanged();
hideFoldersBtn = (AppCompatButton) allFoldersView.findViewById(R.id.hide_folder_btn);
hideFoldersBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("******** TOTAL SELECTED: " + selectedFoldersToHide.size());
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putStringArrayListExtra("FOLDERS_TO_HIDE", selectedFoldersToHide);
getActivity().setResult(RESULT_OK, intent);
getActivity().getSupportFragmentManager().popBackStack();
}
});
}
}
創建一個接口,說PassArrayList
並在Activity
實現它。
public interface passArrayList {
public void onItemsSelected(List<String> selectedItems);
}
public class MainActivity extends AppCompatActivity implements passArrayList{
// ...
@override
public void onItemsSelected(List<String> selectedItems){
//your code goes here
}
}
在您的片段中,添加以下內容:
PassArrayList mCallback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallback = (PassArrayList) getActivity();
}
@Override
public void onDetach() {
super.onDetach();
mCallback = null;
}
在代碼中的某處,當您要將歌曲列表傳遞回Activity
請調用mCallback
對象上的mCallback
onItemsSelected()
方法,並將ArrayList
傳遞給此方法。 然后,此ArrayList
將作為Activity
方法onItemsSelected()
的參數來使用,您可以使用它進行任何所需的操作。 但不要忘記在onDetach()
掛鈎方法中取消指向mCallback
鏈接,以防止上下文泄漏。
1)這是一個將數據從片段傳遞到活動的基本示例:
在片段A中
((ParentActivity)getActivity()).dispatchInformations(list);
在ParentActivity中
public void dispatchInformations(List dataList){
}
2)或創建一個接口並在活動中實現 ,將引用傳遞給片段並在活動中獲得結果。
最簡單的方法是使用EventBus :
public static class MessageEvent { /* your arraylist here */ }
//Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode in Activity:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
// send event from your Fragment
EventBus.getDefault().post(new MessageEvent(YourArrayList));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.