2015-03-31 41 views
0

我想建..使用Activity的生命週期創建可重用對話框的最佳方式是什麼?

  • 可重複使用的對話框
  • 完全可定製的佈局(自定義顏色或字體等)
  • 維持其生命週期中所引用的活動
  • 使用重載我可以創建對話的多種變體,即標題,消息和回調的組合
  • 以簡單的方式(如果可能的話)

目前我的自定義對話框類的樣子:

public class CustomAlert { 

public interface OnSingleClickedListener { 
    public void onPositiveClicked(); 
} 

public interface OnDualClickedListener { 
    public void onPositiveClicked(); 
    public void onNegativeClicked(); 
} 

/** 
* Show simple alert without callback. 
* @param context 
* @param msg 
*/ 
public static void showAlert(Context context, String msg) { 
    final Dialog dialog = new Dialog(context); 
    // Do some stuff 

    ok.setOnClickListener(new Button.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      dialog.dismiss(); 
     } 
    }); 
    dialog.show(); 
} 

/** 
* Show simple alert with callback. 
* @param context 
* @param msg 
* @param listener 
*/ 
public static void showAlert(Context context, String msg, final OnSingleClickedListener listener) { 
    final Dialog dialog = new Dialog(context); 
    // Do some stuff 

    ok.setOnClickListener(new Button.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      dialog.dismiss(); 
      listener.onPositiveClicked(); 
     } 
    }); 
    dialog.show(); 
} 
// Some other methods.. 
} 

我呼籲這些警報從活動是這樣的:

if(!isFinishing()) { 
    CustomAlert.showAlert(MainActivity.this, getResources().getString(R.string.network_no_connection)); 
} 

即使我打電話isFinishing()檢查主機活動正在運行,我總是看到BadTokenException,is your Activity running?,我想也許isFinishing()是不夠的。

我發現這個article這是使用DialogFragment,但我覺得這是相當多的代碼這麼小的任務,當我考慮以上要求。

什麼是解決此問題的最值得推薦的有效解決方案?

在此先感謝!

+0

使用getApplication上下文來避免此異常。這發生在你的活動不易被使用或銷燬,並且你試圖使用它的上下文 – Arslan 2015-03-31 06:16:52

+0

推薦的方式是DialogFragments – 2015-03-31 07:56:30

+0

@Arslan我對使用ApplicationContext有點小心,因爲潛在的內存泄漏。我不確定這是否是最佳解決方案。 – 2015-03-31 19:03:17

回答

0

像這樣創建一個自定義類,我創建了這個對話框豎起大拇指和拇指向下在我的應用Play商店

//recommend dialog 
public void showRecommendDialog(Context mContext) 
{ 
    dialog = new Dialog(mContext,android.R.style.Theme_Holo_Dialog_NoActionBar); 
    dialog.setContentView(R.layout.recommend_dialog); 
    dialog.show(); 

    btnThumbsUp = (ImageButton) dialog.findViewById(R.id.btn_Yes); 
    btnThumbsDown = (ImageButton) dialog.findViewById(R.id.btn_no); 
    txtMsg=(TextView) dialog.findViewById(R.id.txtMsg); 

    ImageButton cancelRecommend=(ImageButton) dialog.findViewById(R.id.cancelRecommend); 
    cancelRecommend.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      dialog.dismiss(); 
      dialog=null; 
     } 
    }); 

    btnThumbsUp.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      //do what you want 
     } 
    }); 


    btnThumbsDown.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      //do what you want 
     } 
    }); 
} 

這裏命名Debongo - Restaurant Finder是相同

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#FFFFFF" 
android:gravity="center" 
android:padding="5dp" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="5dp" > 

    <ImageButton 
     android:id="@+id/cancelRecommend" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:background="@android:color/transparent" 
     android:contentDescription="@null" 
     android:src="@drawable/com_facebook_close" /> 

    <TextView 
     android:id="@+id/txtMsg" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/cancelRecommend" 
     android:layout_marginBottom="@dimen/viewSpace3" 
     android:layout_marginLeft="@dimen/viewSpace3" 
     android:layout_marginRight="@dimen/viewSpace3" 
     android:text="Do You Want To Recommend This Restaurant ?" 
     android:textColor="#000000" 
     android:textSize="@dimen/titlebar_textSize" 
     tools:ignore="HardcodedText" /> 

    <View 
     android:layout_width="0dip" 
     android:layout_height="@dimen/viewSpace3" /> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/txtMsg" 
     android:layout_centerHorizontal="true" 
     android:layout_gravity="center" > 

     <ImageButton 
      android:id="@+id/btn_Yes" 
      android:layout_width="@dimen/viewSpace5" 
      android:layout_height="wrap_content" 
      android:background="@android:color/transparent" 
      android:contentDescription="@null" 
      android:src="@drawable/unselected_thumbs_up" /> 

     <View 
      android:id="@+id/vvv" 
      android:layout_width="@dimen/viewSpace1" 
      android:layout_height="@dimen/viewSpace3" 
      android:layout_toRightOf="@id/btn_Yes" /> 

     <ImageButton 
      android:id="@+id/btn_no" 
      android:layout_width="@dimen/viewSpace5" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@id/vvv" 
      android:background="@android:color/transparent" 
      android:contentDescription="@null" 
      android:src="@drawable/unselected_thumbs_down" /> 

    </RelativeLayout> 

</RelativeLayout> 
佈局文件

現在,當你想打開此對話框,你可以通過使用

叫它
showRecommendDialog(this); 
+0

感謝您花時間回答問題,但這正是我現在正在做的,我正在尋找更好的解決方案。 – 2015-03-31 18:54:17

相關問題