2011-12-01 230 views
3

我有兩個問題,如果您擴展了一個視圖,使得您的新視圖是MyView的擴展視圖,並且MyView具有自定義方法和變量,那麼您如何訪問onClick上的這些方法和變量?Android處理點擊事件

如果

MyView mv = new MyView() 
mv.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // CANNOT access MyView since v is a View and not MyView? 

    } 
}); 

回答

0

它很簡單。

mv.setOnClickListener(new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
    // Just check whether the view is of your type or not. 
    // If you are sure its gonna be MyView you can skip it 
    if(v instanceof MyView) { 
     MyView mv = (MyView)v; 
     mv.yourCustomMethod(); 
    } 

    } 
}); 
0

使用這樣的關鍵字super

super.myParentMethod()

父方法和變量/存取方法必須至少protected來訪問它們。他們不能是private

1

您確定最終的關鍵字,然後您就可以調用mv的方法。

final MyView mv = new MyView() 
mv.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     mv.myFunction(); 

    } 
}); 
0

您需要的View v轉換爲MyView爲了調用自己的方法。

@Override 
public void onClick(View v) { 
    MyView mv = (MyView)v; 
    mv.myMethod(); 
} 
1
  1. 你可以投的輸入視圖(這不是我喜歡的選項) 您的MyView的類。
  2. 您可以使MyView mv變量爲final,並在您的匿名內部類中訪問它。
  3. 或者你可以打破你OnClockListener了一個匿名內部類的一個 嵌套類和設置MyView的作爲參數

例子:

MyView mv = new MyView(); 
MyOnClickListener listener = new MyOnClickListener(mv); 
mv.setOnClickListener(listener); 

... 

public class MyOnClickListener implements View.OnClickListener{ 
    private MyView mv; 

    public MyOnClickListener(MyView mv){ 
     this.mv = mv; 
    } 

    @Override 
    public void onClick(View v) { 
     mv.doSomething(); 
    } 
} 
+0

謝謝你,我發誓,我試過了,但我不得有。這就是我在感冒時編程所得到的結果。 – esse