2013-10-06 69 views
3

我建立我在其中執行活動的超類型方法的Android應用程序稱爲onCheckedChanged(CompoundButton buttonView, boolean isChecked)如下:如何在Android/Java中以不同的方式傳遞參數?

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (isChecked){ 
     LinearLayout view = (LinearLayout) findViewById(R.id.some_view); 
     Animation anim = expand(view, true); 
     view.startAnimation(anim); 
    } 
    else { 
     LinearLayout view = (LinearLayout) findViewById(R.id.some_view); 
     Animation anim = expand(view, false); 
     view.startAnimation(anim); 
    } 
} 

而且這種方法會被設置爲監聽在這樣的onCreate方法交換機:

mySwitch = (Switch) findViewById(R.id.my_switch); 
mySwitch.setOnCheckedChangeListener(this); 

現在的事情是我想實現這個方法不僅爲some_view,但也爲其他一些意見。因爲我不想複製/粘貼這個方法幾次,只是改變some_view我需要一些傳遞視圖的方式。由於我重寫了這個方法,但是我不能簡單地爲該方法添加一個參數。因爲我爲這個方法設置了一個監聽器,所以在這個方法被調用之前,我也不能將這個id設置爲一個全局變量。

所以我的問題是:我怎麼能傳遞一個ID,以這種方法,這樣我就不需要複製/粘貼方法重用了好意見?

回答

3

實現自己OnCheckedChangeListener和的兩個選項一個適合您的需要:

  1. 使用此偵聽器的多個實例。每對<Switcher, LinearLayout>一個。
  2. 使用這個監聽器持有的LinearLayouts陣列,以動畫所有這些開關的一個Switcher實例時的一個實例。

這是代碼,這兩個選項。

public class MyOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener { 

    private final View[] mViews; 

    public MyOnCheckedChangeListener(View... views) { 
     mViews = views 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     for (View v : mViews) { 
      LinearLayout layout = (LinearLayout) v; 
      if (isChecked) { 
       Animation anim = expand(layout, true); 
       layout.startAnimation(anim); 
      } else { 
       Animation anim = expand(layout, false); 
       layout.startAnimation(anim); 
      } 
     } 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // inflate layout 

    // option 1 
    mySwitch = (Switch) findViewById(R.id.my_switch); 
    mySwitch.setOnCheckedChangeListener(
      new MyOnCheckedChangeListener(findViewById(R.id.some_view))); 
    myOtherSwitch = (Switch) findViewById(R.id.my_other_switch); 
    myOtherSwitch.setOnCheckedChangeListener(
      new MyOnCheckedChangeListener(findViewById(R.id.some_other_view))); 

    // option 2 
    mySwitch = (Switch) findViewById(R.id.my_switch); 
    mySwitch.setOnCheckedChangeListener(
      new MyOnCheckedChangeListener(new View[]{ 
        findViewById(R.id.some_view), 
        findViewById(R.id.some_other_view) 
      })); 
} 
1

把所有這些ID在一個整數數組:

int ids[] = {R.id.view1, R.id.view2, . . ...}; 

組標籤CompoundButton buttonView上創造:

buttonView.setTag(ids[index]); 

然後,裏面的方法:

buttonView.getTag(); 

而且,用它)

1

您可以實現爲監聽每個開關,而不是你的活動實施OnCheckedChangeListener直接,每個調用下面的方法(這等同於當前的監聽器anonymous class,但更短,需要viewId

private void onCheckedChanged(CompoundButton buttonView, boolean isChecked, int viewId) { 
    LinearLayout view = (LinearLayout) findViewById(viewId); 
    Animation anim = expand(view, isChecked); 
    view.startAnimation(anim); 
} 

然後在交換機上:

mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {   
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      super.onCheckedChanged(buttonView, isChecked, some_view_id); 
     } 
    }) 
相關問題