2013-03-04 293 views
1
中的警報對話框

我解決了定製的警告對話框問題。這是它有一個自定義的視圖,其中包含兩個按鈕一個用於數據庫操作和其他用於加載另一個activity.I想dismiss對話框執行數據庫操作後。但現在我不能宣佈任何命令,如dialog.dismiss()cancel()finish()請有人幫我解決這個問題。無法關閉android

我的班級

@Override 
    protected boolean onTap(int index) { 
    OverlayItem item = mapOverlays.get(index); 
    final String title= item.getTitle(); 
    final String snippet= item.getSnippet(); 
    AlertDialog.Builder dialog = new AlertDialog.Builder(this.context); 
    if(title.equalsIgnoreCase("Your Location")){ 
    dialog.setTitle(item.getTitle()); 
    dialog.setMessage(item.getSnippet()); 
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
     } 
    }); 
    } 
    else if(title.equalsIgnoreCase("")){ 
    LinearLayout layout = new LinearLayout(context); 
    layout.setOrientation(LinearLayout.VERTICAL); 

    final Button park_button = new Button(context); 
    park_button.setHint("Park here"); 
    // park_button.setBackgroundResource(); 
    layout.addView(park_button); 
    park_button.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      System.out.println("parkbutton:Clicked"); 
      // Delete DB Values 
      int count = db.getDatasCount(); 
      for(int i = 0;i<count;i++){ 
       db.deleteValues(i); 
      } 
      //latitude & longtitude (string) 
       String latitude = String.valueOf(lat); 
       String longtitude = String.valueOf(lon); 
       Log.d("Insert: ", "Inserting .."); 
       db.addData(new Datas(latitude, longtitude)); 
       // Toast.makeText(context, "Lat: " + lat + ", Lon: "+lon, Toast.LENGTH_SHORT).show(); 

      // Reading DB Data 
       Log.d("Reading: ", "Reading all Values..."); 
       List<Datas> datas = db.getAllDatas();  

       for (Datas dat : datas) { 
        String log = "Id: "+dat.getID()+" ,Latitude: " + dat.getlat() + " ,Longtitude: " + dat.getlon(); 
         // Writing DB data to log 
       Log.d("DB Data: ", log); 
      } 
      Intent f = new Intent(context,MainTabActivity.class); 
      context.startActivity(f); 
     } 
    }); 


    final Button know_more_button = new Button(context); 
    know_more_button.setHint("Know more"); 
    // park_button.setBackgroundResource(); 
    layout.addView(know_more_button); 
    know_more_button.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      SharedPreferences prefs = context.getSharedPreferences("myprefs", 0); 
      SharedPreferences.Editor editor =prefs.edit(); 
      editor.putString("KEY_REFERENCE", snippet); 
      editor.commit();     

      Intent intent = new Intent(context, SinglePlaceActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(intent); 
     } 
    }); 

    dialog.setView(layout); 
    dialog.setPositiveButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
    } 
    dialog.show(); 
    return true; 
    } 

    public void addOverlay(OverlayItem overlay) { 
     mapOverlays.add(overlay); 
    } 

    public void populateNow(){ 
     this.populate(); 
    } 

} 
+0

嘗試顯示一個對話框,無需設置內容視圖'dialog.setView(佈局);' – vokilam 2013-03-04 11:39:23

+0

但我需要另外設置視圖內的兩個按鈕,這正和否定按鈕 – 2013-03-04 11:44:04

+0

所以問題是你不能從你的自定義佈局的按鈕的點擊監聽器隱藏對話框。這是對的嗎? – vokilam 2013-03-04 11:49:38

回答

2

首先,解釋如何得到你想要的行爲,我需要您重新命名AlertDialog.Builder例如,目前命名爲對話框,以建設者。它沒有準確命名,並且會幫助你理解解決問題的方法。所以這條線:

AlertDialog.Builder dialog = new AlertDialog.Builder(this.context); 

會變成:

AlertDialog.Builder builder = new AlertDialog.Builder(this.context); 

從那裏,你將需要:

  1. 創建最終參考返回的AlertDialog實例給你打電話時show() - 並致電對話框
  2. 接下來,移動按鈕,單擊您在構建器上調用show()的地方下方設置的偵聽器。
  3. 最後,請參考對話框 var我已經創建並調用了dismiss()。
下面

見代碼:

// ... original code here (right before the end of your onTap main method) 
final AlertDialog dialog = builder.show(); // this line used to be "dialog.show();" 
know_more_button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // ... original code here 
     dialog.dismiss(); 
    } 
}); 
// ... for the other button, do the same 
return true; 
0

做到這一點

final AlertDialog.Builder dialog = new AlertDialog.Builder(this.context);

AlertDialog.Builder dialog = new AlertDialog.Builder(this.context);

+0

問題仍然存在 – 2013-03-04 11:20:36

+0

解釋爲什麼你需要這樣做有助於理解答案 – 2013-03-04 11:36:31

+0

這裏我在佈局中設置了兩個按鈕,並且該視圖再次粘貼到此警報對話框中盒子,所以除了這個正面的按鈕還有兩個按鈕和第一個按鈕的負面按鈕點擊我需要執行一些數據庫操作,我做到了,但在此操作後,我不能忽略dialog.dissmiss()的對話框原因沒有得到到按鈕單擊 – 2013-03-04 11:47:42

1

儘量延長DialogFragment如果它是可以接受的(你需要從FragmentActivity拓展業務)。

public static class Dialog extends DialogFragment { 

    @Override 
    public android.app.Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder b = new AlertDialog.Builder(getActivity()); 

     Button btn = new Button(getActivity()); 
     btn.setText("dismiss"); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       dismiss(); 
      } 
     }); 

     b.setView(btn); 
     b.setPositiveButton("OK", null); 
     return b.create(); 
    } 
} 

您可以用這種方式顯示對話框(android.support.v4使用):

new Dialog().show(getSupportFragmentManager(), "dialog"); 

你也需要對話和活動之間建立communication

+0

對不起,實際上這是我的完整類http://pastie.org/6378841 – 2013-03-04 12:12:29

+1

你可以實現這一點,如果你的'context'成員將是FragmentActivity。或者你可以使用方法'onOverlayItemTapped(Item item)'暴露一個接口,並在activity中處理tap事件(而不是ItemizedOverlay) – vokilam 2013-03-04 12:23:26

+0

感謝你花費了我和我的時間 – 2013-03-04 12:24:58