1

我有一個MainActivity舉辦了fragment稱爲FragmentOne 還有另一個Activity命名DetailPagerActivity託管在其他fragment稱爲DetailFragment調用方法

我想在FragmentOne使用methodDetailFragment ..我該怎麼辦呢? 我想等使用FragmentManager和,但未能

我想打電話給getDetailReport()DeatilFragmentonSwiped>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; 
} 
.. 
..} 
+0

一個活動不應該依賴於任何其他活動實例(或其片段)的存在。 –

+0

@KevinKrumwiede是的,我現在知道這一點,謝謝 –

回答

0

您應該將getDetailsReport()從片段中移出並放入某種數據/實用程序類中 - 然後您可以從兩個地方調用它。數據應與用戶界面分開,特別是如果您需要在多個活動/片段中使用它時。

如果你想不相關的活動/片段之間的溝通,最簡單的方法是使用廣播/廣播接收器。這通常是用來通知其他活動/片段的東西需要被更新 - 而不是試圖查詢數據的其他活動/片段。通常,片段/活動會在接收到廣播時更新,如果從頭開始初始化,則會處於良好狀態。

你會遇到的性活動時/片段的問題依賴於其他活動/片段是不顯示的人可以清理 - 所以你不能靠實際行動發生。

+0

是的有道理,謝謝。我在另一個'class',我'DetailLab'移動'getDetailReport',所以現在我可以從我的兩個'Fragment's叫它 –