簡體   English   中英

來自不同活動中另一個片段的片段的調用方法

[英]Call method of a fragment from another fragment in different activities

我有一個MainActivity主持的fragment稱為FragmentOne還有另一個Activity命名DetailPagerActivity托管另一個fragment稱為DetailFragment

我想在FragmentOne使用DetailFragment中的method ..我該怎么做? 我嘗試使用FragmentManager等,但失敗了

我想在onSwiped > FragmentOneDeatilFragment調用getDetailReport()

這是我的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()從片段中移出,並移到某種數據/實用程序類中-然后您可以從兩個地方調用它。 數據應該與UI分開,特別是如果您需要在多個“活動/片段”中使用它。

如果要在不相關的活動/片段之間進行通信,最簡單的方法是使用Broadcast / BroadcastReceiver。 這通常用於通知其他活動/片段需要進行某些更新-而不是嘗試向其他活動/片段查詢數據。 通常,如果片段/活動接收到廣播,則它將更新;如果從頭開始初始化,則片段/活動將處於良好狀態。

在使活動/片段依賴於其他活動/片段時,您會遇到的問題是,可以清除未顯示的活動/片段,因此您不能依賴實際發生的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM