2012-10-29 81 views
3

也許我錯過了這裏,但在這裏。讓說,我延伸按鈕從自定義按鈕訪問活動

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;如果我點擊按鈕,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

不幸的是它不工作。至於(對話)上下文的投射,甚至Eclipse都會抱怨。對我來說很奇怪的是(Activity)上下文產生java.lang.ClassCastException:android.view.ContextThemeWrapper不能轉換爲android.app.Activity。無論如何感謝回覆。 – krisk

+0

你是對的對話框不能對上下文進行轉換,因爲對話框沒有擴展上下文......但是'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