程式結構:Activity - Fragment - Class

問題:

在 Fragment 的 Class 中使用 Toast 與 AlertDialog 會錯誤,

也無法透過 getActivity()調用Context
==================================================================================
【解決方法】:

一、在 Fragment 的 Class:SearchBookPage.java
(public class SearchBookPage extends Fragment

--------------------------------------------------------------
1. 建立一個讓主Activity實做的介面:FragmentClassListener 

 public interface FragmentClassListener{


 //介面方法1:使用Toast
 void useToastOnActivity(CharSequence message, //參數1:要顯示的訊息
                                       int time);                        //參數2:顯示時間長短
                                                                            //    Toast.LENGTH_LONG  長時間
                                                                           //    Toast.LENGTH_SHORT 短時間

    }


 //介面方法2:使用AlertDialog (只有確認鍵)
 void useAlertDialogOnlyConfirmOnActivity(CharSequence title,     //參數1:標題
                                                                  CharSequence message); //參數2:訊息

 

 //介面方法3:使用AlertDialog (有「確定」和「取消」)
 boolean useAlertDialogHaveChoiceOnActivity(CharSequence title,         //參數1:標題
                                                                       CharSequence message); //參數2:訊息
--------------------------------------------------------------                        
2. 宣告介面變數
 private FragmentClassListener mFragmentClassListener;

--------------------------------------------------------------
3. 讓Activity調用的方法:和主Activity產生聯繫 (主Activity會存進listener) 
 public void setFragmentClassListener(FragmentClassListener listener) {
        mFragmentClassListener = listener;
 }
--------------------------------------------------------------
4. Fragment的Class自己要調用的方法

//方法1:使用Toast
 private void useToastOnFragmentClass(String mToastMessage, int time) { 
     if(mFragmentClassListener != null) { //主Activity有存進來
          mFragmentClassListener.useToastOnActivity(mToastMessage, time);
     }
 }

//方法2:使用AlertDialog (只有確認鍵)
 private void useAlertDialogOnlyConfirmOnFragmentClass(CharSequence title, 
                                   CharSequence message){
    if(mFragmentClassListener != null) { //主Activity有存進來
       mFragmentClassListener.useAlertDialogOnlyConfirmOnActivity(title, message);
    }
 }
//方法3:使用AlertDialog (有「確定」和「取消」)
 private boolean useAlertDialogHaveChoiceOnFragmentClass(CharSequence title, 
                                  CharSequence message){
     if(mFragmentClassListener != null) { //主Activity有存進來
        return mFragmentClassListener.useAlertDialogHaveChoiceOnActivity(title, message);
     }
     else 
       return false;
 }
/****************************************************************************************/
二、在主Activity頁面:BrowseAndSearch.java

1.主 Activity 要實做介面
public class BrowseAndSearch extends Activity 
        //實做SearchBookPage的Listener
        implements SearchBookPage.FragmentClassListener{         
----------------------------------------------------------------------

2.監聽SearchBookPage的Listener
  searchBookPage.setFragmentClassListener(this);
----------------------------------------------------------------------
3.實做介面方法:

//使用Toast的方法
    @Override
    public void useToastOnActivity(CharSequence message,int time) { 
        Toast.makeText(this, message, time).show();
    }
//---------------------------------------------------------------
 //方法2:使用AlertDialog (只有確認鍵)
 @Override
 public void useAlertDialogOnlyConfirmOnActivity(CharSequence title,
                         CharSequence message) {        
 //產生AlertDialog對話方塊(匿名物件)
 new AlertDialog.Builder(BrowseAndSearch.this)
 .setTitle(title)
 .setMessage(message)
 .setPositiveButton("確認",null)
 .show();                
 }
//---------------------------------------------------------------
//方法3:使用AlertDialog (有「確定」和「取消」)
 @Override
 public boolean useAlertDialogHaveChoiceOnActivity(CharSequence title,
                           CharSequence message) {    
 //產生AlertDialog對話方塊(匿名物件)
 new AlertDialog.Builder(BrowseAndSearch.this)
 .setTitle(title)
 .setMessage(message)
 .setPositiveButton("確定",
      new DialogInterface.OnClickListener() {    //按下「確定」時的事件                    
            @Override
            public void onClick(DialogInterface dialog, int id) {
                alertDialogChoiceOnFragmentClass=true;    //要宣告為主類別的成員變數才能在這用                                  
            }
        })
 .setNegativeButton("取消",
    new DialogInterface.OnClickListener() {    //按下「取消」時的事件                    
            @Override
            public void onClick(DialogInterface dialog, int id) {
                alertDialogChoiceOnFragmentClass=false;    //要宣告為主類別的成員變數才能在這用                                  
            }
        })                              
 .show();
 return alertDialogChoiceOnFragmentClass;
}
//---------------------------------------------------------------
    //銷毀Listener的方法
    @Override
    protected void onDestroy() { //當銷毀時要做的內容
        super.onDestroy();
        searchBookPage.setFragmentClassListener(null);
    }

======================================================
參考資料:
https://stackoverflow.com/questions/40007374/how-to-call-a-toast-in-the-class

創作者介紹
創作者 蕭小牛的部落格 的頭像
蕭小牛

蕭小牛的部落格

蕭小牛 發表在 痞客邦 留言(0) 人氣( 475 )