从不同活动中的另一个片段调用片段的方法

Call method of a fragment from another fragment in different activities

我有一个 MainActivity 主持了一个名为 FragmentOnefragment 并且还有一个名为 DetailPagerActivityActivity 主持了另一个名为 DetailFragment

fragment

我想在 FragmentOne 中使用来自 DetailFragmentmethod .. 我怎样才能做到这一点? 我尝试使用 FragmentManager 等等,但失败了

我想在 onSwiped 中从 DeatilFragment 调用 getDetailReport() > FragmentOne

这是我的 FragmentOne :

public class FragmentOne extends Fragment {

private RecyclerView mDetailRecyclerView;
private DetailAdapter mAdapter;
private boolean mNumberVisible;

private View view;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true); }

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_one_layout,
            container, false);

    mDetailRecyclerView = (RecyclerView)
            view.findViewById(R.id.detail_recycler_view);
        ..
        ..
    return view;
}

@Override
public void onResume() {
    super.onResume();
    updateUI();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(SAVED_NUMBER_VISIBLE, mNumberVisible);
}


private class DetailHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener, View.OnLongClickListener {
    private TextView mTitleTextView;
    private Detail mDetail;
    private RatingBar mRatingBar;

    public DetailHolder(LayoutInflater inflater, ViewGroup parent) {
        super(inflater.inflate(R.layout.list_item_detail,
                parent, false));

        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        mTitleTextView = (TextView) itemView.findViewById(R.id.detail_title);
        mRatingBar = (RatingBar) itemView.findViewById(R.id.ratingBar);

    }

    public void bind(Detail detail) {
        mDetail = detail;
        mTitleTextView.setText(mDetail.getTitle());
        mRatingBar.setRating(mDetail.getRate()); }

    @Override
    public void onClick(View view) {
        Intent intent = DetailPagerActivity.newIntent(getActivity(),
                mDetail.getId());
        startActivity(intent); }

        return true;
    }
}


private class DetailAdapter extends RecyclerView.Adapter<DetailHolder> {
    private List<Detail> mDetails;

    public DetailAdapter(List<Detail> details) {
        mDetails = details;
    }

    @Override
    public DetailHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater =
                LayoutInflater.from(getActivity());

        return new DetailHolder(layoutInflater, parent);
    }

    @Override
    public void onBindViewHolder(DetailHolder holder, int position) {
        Detail detail = mDetails.get(position);
        holder.bind(detail);
    }

    @Override
    public int getItemCount() {
        return mDetails.size();
    }

    public void setDetails(List<Detail> details) {
        mDetails = details;


        ////////////////////////////////////////////////////////////////////////////////////////////////////////
        ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            private Detail mDetail;

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
                final int position = viewHolder.getAdapterPosition(); //get position which is swipe

                    if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); //alert for confirm to delete
                        builder.setMessage("Are you sure to delete?");    //set message

                        builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                Intent i = new Intent(Intent.ACTION_SEND);
                                i.setType("text/plain");
                                i.putExtra(Intent.EXTRA_TEXT, getDetailReport());
                                i.putExtra(Intent.EXTRA_SUBJECT,
                                        getString(R.string.detail_report_subject));
                                i = Intent.createChooser(i, getString(R.string.send_report));
                                startActivity(i);

                                //////////////////////////////////////////////////////
//                                mAdapter.notifyItemRemoved(position);    //item removed from recylcerview
//                                DetailLab.get(getActivity()).deleteDetail(mDetail);
//                                updateUI();
//                                updateNumbers();
                                dialog.dismiss();
//                                return;
                            }
                        }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                        builder.show();  //show alert dialog
                    }
                }
            };
            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
            itemTouchHelper.attachToRecyclerView(mDetailRecyclerView); //set swipe to recylcerview

        }
    }
}

这是我的 DetailFargment:

public class DetailFragment extends Fragment {

private static final String ARG_DETAIL_ID = "detail_id";
private static final String DIALOG_DATE = "DialogDate";
private static final String DIALOG_PHOTO = "DialogPhoto";

private static final int REQUEST_DATE = 0;
private static final int REQUEST_PHOTO = 2;

..
..

public static DetailFragment newInstance (UUID detailId) {
    Bundle args = new Bundle();
    args.putSerializable(ARG_DETAIL_ID, detailId);

    DetailFragment fragment = new DetailFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);

    UUID detailId = (UUID) getArguments().getSerializable(ARG_DETAIL_ID);
    mDetail = DetailLab.get(getActivity()).getDetail(detailId);

    mPhotoFile = DetailLab.get(getActivity()).getPhotoFile(mDetail);
}

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

    DetailLab.get(getActivity()).updateDetail(mDetail);
}

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_detail,
            container, false);


     ..
     ..

    /////////////////////////// Report Button
    mReportButton = (Button) v.findViewById(R.id.detail_report);
    mReportButton.setOnClickListener(new View.OnClickListener() {
        public void onClick (View v) {

            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("text/plain");
            i.putExtra(Intent.EXTRA_TEXT, getDetailReport());
            i.putExtra(Intent.EXTRA_SUBJECT,
                    getString(R.string.detail_report_subject));
            i = Intent.createChooser(i, getString(R.string.send_report));
            startActivity(i);
        }
    });
..
..
    return v;
}

@Override
public void onResume() {
    super.onResume();
}

//////////////////////////////////// REPORT
private String getDetailReport() {
    String dateFormat = "EEE, MMM dd";
    String dateString = DateFormat.format(
            dateFormat, mDetail.getDate()).toString();

    String rateString = null;

    String report = getString(R.string.detail_report,
            mDetail.getTitle(), dateString,
            rateString, rateString
            );

    return report;
}
..
..}

您应该将 getDetailsReport() 移出片段并移入某种 data/utility class - 然后您可以从两个地方调用它。数据应该与 UI 分开,尤其是当您需要在多个 Activity/Fragment.

中使用它时

如果要在不相关的对象之间进行通信activities/fragments,最简单的方法是使用Broadcast / BroadcastReceiver。这通常用于通知其他 activity/fragment 某些内容需要更新 - 而不是尝试向其他 activity/fragment 查询数据。通常 fragment/activity 会在接收到广播时更新,或者在从头开始初始化时处于良好状态。

在使 activities/fragment 依赖其他 activities/fragment 时,您将 运行 遇到的问题是未显示的可以清理 - 所以您不能依赖实际发生的动作。