2012-02-03 8 views
0

일부 데이터를 표시하기 위해 View 클래스를 확장하는 클래스를 작성했습니다. 사용자는이 데이터를 클릭하고 대화 상자에 다양한 옵션을 표시하여이 데이터를 조작 할 수 있어야합니다.안드로이드 : 클래스에서 대화 표시

그러나 안드로이드에서 AlertDialog.Builder 인스턴스를 초기화하기 위해서는 작동을 위해 "this"를 전달해야합니다 (getApplicationContext()는 작동하지 않습니다). 작업 -이 기사 참조 : Dialog throwing "Unable to add window — token null is not for an application” with getApplication() as context)

이 문제를 극복하고 내 클래스에서보기를 확장하는 대화 상자를 표시하려면 어떻게해야합니까?

답변

0

View.getContext()을 사용하고 AlertDialog.Build 인스턴스로 전달하십시오.

0

당신은 몇 가지 코드를 게시해야한다, 또는 우리에게 몇 가지 코드를 보여주십시오 대신 그럼 ...의

getParent(); 

으로 시도 LT

+0

뷰 내 getParent는 표시되는 대화 상자에 유효하지 않은 ViewParent 객체를 반환합니다. 나는 또한 생성자를 통해 클래스에 액티비티를 전달하고 getParent를 사용하여 시도해 보았습니다 ... –

3

가 아닌 뷰 클래스에서 메시지 박스를 열어야하는 경우

  • 사용 핸들러 : http://developer.android.com/reference/android/os/Handler.html 다음,보기에서 핸들러를 작성 보관 클래스에 전달 당신은 두 가지 솔루션이있다. 메시지 상자에 전화를 걸 때 사용하려면

    handler.post (새 Runnable() {// 여기에 메시지 상자 표시}); 당신의 안드로이드보기에서

    또는

    , 당신이 당신의 클래스를 인스턴스화 할 때, 클래스의 생성자에 컨텍스트를 통과 한 다음이 컨텍스트를 저장합니다. 그런 다음 경고 상자에서 사용할 수 있습니다.

하면 컨텍스트 통과 mecanism와 메모리 누수에주의

편집 : 나는 기회를 데려 갔다 할 때

난 당신이 핸들러를 사용하는 방법에 가야하는 몇 가지 코드를 작성했다 의사. 일반적으로 거기에 아무것도 사용하지만,이 특별한 경우에, 오, 기적, 내가 찾은, 완성 및 핸들러와 메시지 메카니즘을 사용하는 방법의 코드 예제를 이해하기 쉽습니다보세요. http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar

EDIT2 후 연산 때문에

논평 : 그것은 접을 제목 ("http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar") 아래에 숨겨져있다 객체를 다른 활동에서 재사용 할 수 있기를 원한다면 핸들러를 사용하지 말고 컨텍스트 (실제로 호출하는 활동에 대한 링크)를 객체에 전달하는 것이 좋습니다. 그러면 객체는 dialog.builder에서이 컨텍스트를 사용할 수 있습니다.MyActivity라는 활동 클래스의 한 OnCreate에서

: 개체 클래스에서

MyCustomObject myObject = new MyCustomObject(this); 

Class MyCustomObject { 
    private MyActivity mContext; 

    void MyCustomObject(MyActivity context) { 
    this.mContext = context; 
    } 

    private showDialog(String message) { 
    AlertDialog.Builder alert = new AlertDialog.Builder(mContext);//we use the context 
    } 
} 

파괴하는 것을 잊지 마세요 및 무효화 대화 빌더 제품과 mContext 당신이 함께 할 때 너의 물건. 이렇게하면 메모리가 정말 빨리 누출 될 수 있습니다.

+0

현재이 작업을 수행 중입니다. getApplicationContext를 전달할 수없는 AlertBuilder.dialog 생성자에 버그가 있습니다.(); 작동하는 유일한 것은 활동에서 "this"를 전달하는 것입니다. 그러나 이것을 전달하면 여전히 게시물에 연결된 스레드에서 "유효하지 않은 토큰"예외가 발생합니다 ... –

+0

귀하의 게시물에서 알 수있는 것부터, 귀하가 시도하려고하는 것을 전혀하지 않은 것입니다 : alertDialog 호출에 특별히 사용되는 로컬 변수로 저장 한 클래스에 Handler를 사용하거나 활동 컨텍스트를 전달하십시오. 나의 이해가 정확하다면, applicationContext가 작동하지 않는 것은 applicationcontext가 ui 스레드에 연결되어 있지 않기 때문에 버그가 아닙니다. 일부 코드로 내 대답을 업데이트 할 것입니다. – Yahel

+0

알겠습니다. 대화 상자를 표시하는 가장 좋은 방법은 활동 클래스에서 온 것이라고 말하고 있습니다. 뷰 내에서 모든 대화 코드를 갖기를 원하는 이유는 뷰가 배치 된 곳마다 대화 처리 코드가 동일 할 것이기 때문입니다. 매번 다시 작성해야 할 많은 대화 코드가 있기 때문입니다. 아마도 내가 생각했던 활동 내에서 대화 상자를 처리하는 더 쉬운 방법이 있을까요? –