2012-10-29 2 views
3

어쩌면 여기에 sth가 누락되었지만 여기에 있습니다. 내가 버튼 확장한다고 가정 해 봅시다맞춤 검색 버튼에서 활동에 액세스

public class MyButton extends Button { 
     ... 
     public MyButton(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      ... 
     } 
    } 
  1. MyButton에 예컨대에있는 경우 MyActivity 나는 단순히 컨텍스트를 활동에 캐스팅 할 수있다.
  2. MyButton이 MyDialog (대화 상자 확장)의 일부인 경우 context.getClass()가 ContextThemeWrapper를 가리키고 액티비티를 가져올 수 없습니다.

두 번째 경우에는 대화 나 작업의 인스턴스를 어떻게 얻을 수 있습니까?

편집 좋아 더 나은 내가하고 싶었던 것을 설명하기 위해 더 많은 코드 : 어딘가에

public class MyDialog extends Dialog { 
    private MyButton myButton; 

    public MyDialog(Context context) { 
     super(context) 

     this.setContentView(R.layout.my_dialog); 
     this.setTitle("My Dialog"); 

     myButton = (MyButton) findViewById(R.id.my_button); 
    } 
} 

public class MyButton extends Button implements Command { 
    private MyActivity myActivity; 

    public MyButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     System.out.println(context instanceof ContextThemeWrapper); // TRUE 
     System.out.println(context instanceof Activity); // FALSE 

     myActivity = ??? // or myDialog = ??? 
    } 

    @Override 
    public void execute() { 
     MyDialog myDialog = myActivity.getMyDialog(); 
     myDialog.cancel(); 
    } 

} 

및 다른 클래스에 연결하는 수신기 후 :

@Override 
public void onClick(View v) { 
    Command command = (Command) v; 
    command.execute(); 
} 
+1

질문에 대한 문맥을 기재하십시오. 대화 상자 또는 활동 인스턴스로 무엇을 하시겠습니까? –

+0

예를 들어 MyButton은 execute() 메서드를 사용하여 Command 인터페이스를 구현할 수 있으며 일부 외부 클래스에서는 command = (Command) v;로 onClick() 메서드를 사용할 수 있습니다. 버튼을 클릭하면 execute() 메서드가 실행됩니다. 대화 상자를 닫으려면 예를 들어 MyButton 내부에서 대화 상자 인스턴스로 이동해야합니다. 난 그냥 궁금해서/이것을 읽은 후 놀고 : http://alvinalexander.com/java/java-command-design-pattern-in-java-examples – krisk

답변

1

난 완벽하지 않습니다 당신이하고있는 일을 이해하지만, getOwnerActivity()으로 대화 상자의 활동에 대한 참조를 얻을 수 있어야합니다. 아마도

는 :

public MyButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    Activity activity = getOwnerActivity(); 
    ... 
} 
+0

불행히도 그것은 작동하지 않습니다. 컨텍스트 캐스트 (Dialog)에 관해서는 Eclipse조차도 불평합니다. 나는 (Activity) 컨텍스트가 java.lang.ClassCastException을 생성한다는 것이 이상하다. android.view.ContextThemeWrapper는 android.app.Activity로 캐스팅 될 수 없다. 어쨌든 답장을 보내 주셔서 감사합니다. – krisk

+0

맞아요. Dialog는 Context를 확장하지 않기 때문에 Dialog는 Context 로의 형변환이 될 수 없습니다 ... 그러나 문서가 제시하는대로 Dialog를 여는 한'getOwnerActivity()'메소드가 작동해야합니다. – Sam

16

나는 비슷한 상황이 있었다 나는 내 경우 위트이 조각 해결이 누군가를 도울 수

private static Activity scanForActivity(Context cont) { 
    if (cont == null) 
     return null; 
    else if (cont instanceof Activity) 
     return (Activity)cont; 
    else if (cont instanceof ContextWrapper) 
     return scanForActivity(((ContextWrapper)cont).getBaseContext()); 

    return null; 
} 

희망을.

+0

plug and 재생 해 주셔서 감사합니다. 예외를 초래할 수있는 switch 문을 사용하지 않아서 기쁩니다. – CrandellWS

+0

많은 도움을 주셨습니다. 감사합니다. 정말 작동합니다! – careful7j