java - 根据从 Fragment A 收集的数据使用较少的样板代码从 Activity 启动 Fragment B

标签 java android android-fragments android-activity interface

我有以下设置:

  1. 我有一个启动 FragmentAActivity
    FragmentA 包含一个 recyclerView 和一个 adapter

  2. 我在适配器中有一个 interfaceA,它是在 FragmentA 中实现的,因此我会收到点击哪个位置的通知。

  3. 我在 FragmentA 中创建了第二个 interfaceB,它在启动 Activity 中实现第 1 步中的 FragmentA

  4. 最后,我根据从 interfaceB 获得的数据从 Activity 启动 FragmentB

一切正常,但流程乏味,需要大量样板代码。

目标 是让 activity 启动 fragmentB,其中包含来自 FragmentA< 中 recyclerView 的单个点击项目的数据.

问题:能否以不同的方式实现?

代码如下:

Activity 启动 FragmentA:

Fragment fragment = fragmentManager.findFragmentByTag(FragmentA.class.getName());
    if (fragment == null) {

        fragment = Fragment.instantiate(this, FragmentA.class.getName());
    }
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction
            .replace(R.id.fragmentLayout, fragment, FragmentA.class.getName())
            .addToBackStack(FragmentA.class.getName())
            .commit();

FragmentA 中,我们有 recyclerViewinterfaceAadapter 中实现:

适配器类:

        public class AdapterA extends RecyclerView.Adapter< AdapterA.ViewHolderA> {
        
        //instances
        private Context context;
        private List<Data> dataList;
        private OnItemClickListener onItemListClickListener;
        
        //Constructor
        public AdapterA (Context context, List<Data> dataList, OnItemClickListener onItemListClickListener {
        this.context = context;
        this.dataList = dataList;
        this.onItemListClickListener = onItemListClickListener;
    }

onCreateViewHolder....
onBindViewHolder....
getItemCount...

class ViewHolderA RecyclerView.ViewHolder {
//instances..
//Constructor...

}
        }

接口(interface)类接口(interface)A:

public interface OnItemClickListener {
    void onItemClick(View view, int position);
}

接口(interface)类接口(interface)B:

public interface SingleItemEventListener {
    void onSingleItemClicked(int position);
}

FragmentA 类:

//Instances
private AdapterA adapter;
private RecyclerView recyclerView;
private onSingleItemClicked singleItemEventListener;

onAttach...
onCreateView...

@Override
public void onStart() {
    super.onStart();

    //Setting adapter
    onSetAdapter();
}

private void onSetAdapter() {
    List<Data> dataList;

    dataList = getData();

    adapter = new AdapterA(context, dataList, new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            singleItemEventListener.onSingleItemClicked(position);
        }
    });

Activity 中,我们正在实现 onSingleItemClicked 回调以接收事件并使用从接口(interface)回调接收到的数据启动 FragmentB:

ActivityA implements SingleItemEventListener {
@Override
    public void onSingleItemClicked(int position) {
Data data = getData(position);

if (data != null) {
Bundle bundle = new Bundle();
bundle.putParcelable("single_data_key", data);
Fragment fragmentB = fragmentManager.findFragmentByTag(FragmentB.class.getName());

        if (fragmentB == null && bundle != null) {
            fragmentB = Fragment.instantiate(this, FragmentB.class.getName(), bundle);
        }

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction
                .replace(R.id.FragmentLayout, fragmentB, FragmentB.class.getName())
                .addToBackStack(FragmentB.class.getName())
                .commit();
}
}
}

最佳答案

添加ViewModel到您的 Activity 并使用它在所有组件、Activity 和两个 fragment 之间进行通信。

您可以从 fragment 中访问 Activity 的 ViewModel

MyViewModel model = ViewModelProviders.of(getActivity()).get(MyViewModel.class);

使用LiveData为了交流,从您的 fragment 向它发布一个 Action ,并在您的 Activity 中收听它以启动另一个 fragment 。

关于java - 根据从 Fragment A 收集的数据使用较少的样板代码从 Activity 启动 Fragment B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51311133/

相关文章:

java.lang.IllegalArgumentException : Unknown parameter name : customer 异常

java - 仅从 java 代码创建 fragment

android - R.id 无法解析或不是字段。

android - fragment 未与 fragment 管理器关联。 (对话 fragment )

java - 优化:使 SQL 查询脱离循环

java - 程序在遍历目录树时在 JTextArea 中显示文件名,但我不知道如何通过按键停止它

android - Android Play 商店中的 Delphi 11 应用程序显示警告 : Non-SDK API

java - getApplicationContext() 无法解析

java - 加载 webview 时错误膨胀类 android.webkit.WebView

android-fragments - 在片段 xamarin 之间进行通信