程式結構: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
請先 登入 以發表留言。