【问题标题】:Call method of a fragment from another fragment in different activities在不同活动中从另一个片段调用片段的方法
【发布时间】:2017-08-24 16:56:51
【问题描述】:

我有一个 MainActivity 托管了一个名为 FragmentOnefragment 还有一个名为 DetailPagerActivityActivity 托管了另一个名为 fragmentDetailFragment

我想在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;
}
..
..}

【问题讨论】:

  • 一个活动不应该依赖于任何其他Activity实例(或其片段)的存在。
  • @KevinKrumwiede 是的,我现在知道了,谢谢

标签: android android-fragments android-activity fragment android-fragmentactivity


【解决方案1】:

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

如果您想在不相关的活动/片段之间进行通信,最简单的方法是使用广播/广播接收器。这通常用于通知其他活动/片段需要更新某些内容 - 而不是尝试向其他活动/片段查询数据。通常片段/活动会在收到广播后更新,或者如果从头开始初始化则处于良好状态。

在使活动/片段依赖于其他活动/片段时会遇到的问题是可以清理未显示的活动/片段 - 因此您不能依赖实际发生的操作。

【讨论】:

  • 是的,有道理,谢谢。我将getDetailReport 移动到另一个class,我的DetailLab,所以现在我可以从我的Fragments 中调用它
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2013-10-20
相关资源
最近更新 更多