2013-03-04 3 views
1

사용자 정의 된 alertdialog 상자를 닫는 데 문제가 있습니다. 그것은 하나의 db 조작과 다른 activity를로드하기위한 것입니다. db action이 수행 된 후에 대화 상자를 닫고 싶습니다. 하지만 지금은 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

+0

을하지만 난이 긍정적 이외에 뷰 내부에 두 개의 버튼을 설정해야 그리고 네거티브 버튼 –

+0

사용자 정의 레이아웃에서 버튼의 클릭 리스너로부터 대화 상자를 숨길 수 없다는 것이 문제입니다. 맞습니까? – vokilam

답변

2

첫째을, 당신이 원하는 행동을 얻는 방법을 설명하기 위해, 나는 빌더로, 현재 대화라는 이름의 당신에 AlertDialog.Builder 인스턴스를, 이름을 변경을해야합니다. 정확한 이름이 아니며 문제 해결 방법을 이해하는 데 도움이됩니다. 그래서이 라인 :

  1. 이 반환에 AlertDialog 인스턴스에 최종 참조를 만들기 : 당신이해야합니다, 거기에서

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

    :

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

    가로 변신 것 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

이 DialogFragment를 확장하는이

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

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

+0

여전히 문제가 남아 있습니다 –

+0

이유에 대한 설명은 항상 대답의 이해를 돕기 위해 유용합니다 –

+0

여기 레이아웃에 두 개의 버튼을 설정하고 있으며이보기는이 경고 대화 상자에 다시 고착되어 있습니다. 상자 그래서 두 개의 더 많은 버튼이 긍정적 인 버튼과 네거티브 버튼을 첫 번째 버튼을 클릭하고 일부 DB 작업을 수행 할 필요가 있지만이 작업 후에 dialog.dissmiss() 대화 상자의 원인을 해제 할 수 없습니다 지 않습니다. 버튼 클릭 –

1

시도 할 (당신은 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 –

+1

'context'멤버가 FragmentActivity 인 경우이 작업을 수행 할 수 있습니다. 또는 메소드'onOverlayItemTapped (Item item) '을 사용하여 인터페이스를 노출하고 활동 (ItemizedOverlay 대신)에서 탭 이벤트를 처리 할 수 ​​있습니다. – vokilam

+0

나와 함께 시간을 보냈 어서 고마워요. –

관련 문제