2015-04-06 75 views
21

我的理解是,當我創建偵聽點擊一個按鈕對象我必須:setOnclickListener VS OnClickListener VS View.OnClickListener

  1. 創建按鈕對象
  2. 使用OnClickListner讓它聽用戶點擊
  3. 使用的onClick用戶後執行的操作點擊按鈕

現在

  • 哪裏setOnClickListener配合到上述邏輯?
  • 哪一個實際聽按鈕點擊?
  • setOnclickListener?
  • ONclickListener?
  • View.OnClickListener?
  • 那3個之間有什麼區別?

以下是我在Android開發人員發現:

The example below shows how to register an on-click listener for a Button. 

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

您也可能會發現更方便地實現OnClickListener作爲活動的一部分。這將避免額外的類加載和對象分配。例如:

public class ExampleActivity extends Activity implements OnClickListener { 
    protected void onCreate(Bundle savedValues) { 
     ... 
     Button button = (Button)findViewById(R.id.corky); 
     button.setOnClickListener(this); 
    } 

    // Implement the OnClickListener callback 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
} 

回答

16

邏輯很簡單。 setOnClickListener屬於步驟2

  1. 您創建按鈕
  2. 您創建的OnClickListener實例*就像在例子的完成,並覆蓋onClick - 方法。
  3. 您分配OnClickListener到該按鈕使用btn.setOnClickListener(myOnClickListener);在你的碎片/活動onCreate - 方法。
  4. 當用戶點擊該按鈕時,所分配的OnClickListeneronClick函數被調用。

*如果您使用import android.view.View;,請使用View.OnClickListener。如果您import android.view.View.*;import android.view.View.OnClickListener;您儘可能使用OnClickListener

另一種方式是讓你活動/片段從OnClickListener繼承。通過這種方式,您可以將片段/活動分配爲按鈕的偵聽器,並將onClick作爲成員函數來實現。

2
  1. 首先,有View.OnClickListenerOnClickListener之間沒有什麼區別。如果你直接使用View.OnClickListener,那麼你不需要寫入 -

    import android.view.View。OnClickListener

  2. 您通過setOnclickListener()將OnClickListener實例(例如myListener命名對象)設置爲偵聽器。當一個click事件被激發時,myListener被通知,並且onClick(View view)方法被調用。那就是我們自己的任務。 希望這可以幫助你。

37

假設我們有例如

public class MainActivity extends ActionBarActivity { 

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

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

     } 
    }; 

} 

所以我們會做3個按鈕?

public class MainActivity extends ActionBarActivity { 

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

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

      // So we will make 
      switch (v.getId() /*to get clicked view id**/) { 
       case R.id.corky: 

        // do something when the corky is clicked 

        break; 
       case R.id.corky2: 

        // do something when the corky2 is clicked 

        break; 
       case R.id.corky3: 

        // do something when the corky3 is clicked 

        break; 
       default: 
        break; 
      } 
     } 
    }; 

} 

或者,我們可以這樣做:

public class MainActivity extends ActionBarActivity { 

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

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky is clicked 
      } 
     }); 
     button2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky2 is clicked 
      } 
     }); 
     button3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky3 is clicked 
      } 
     }); 

    } 

} 

或者,我們可以實現View.OnClickListener,我認爲這是最好的辦法:

public class MainActivity extends ActionBarActivity implements View.OnClickListener { 

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

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     // do something when the button is clicked 
     // Yes we will handle click here but which button clicked??? We don't know 

     // So we will make 
     switch (v.getId() /*to get clicked view id**/) { 
      case R.id.corky: 

       // do something when the corky is clicked 

       break; 
      case R.id.corky2: 

       // do something when the corky2 is clicked 

       break; 
      case R.id.corky3: 

       // do something when the corky3 is clicked 

       break; 
      default: 
       break; 
     } 
    } 
} 

最後這裏沒有真正的差異就「比其他方式更好」

+0

雖然第二種方式不會比其他方式稍好一些嗎?第一種和第三種方法首先找出哪個視圖被點擊並隨後採取行動,而第二種方式則可以直接進入視圖。好奇看別人說什麼,因爲我誠實地不是100%確定我的邏輯是否正確。 – CodyEngel

+1

@赫斯基哈斯基。知道什麼時候關注表現,什麼時候關注表現。問問自己:用戶點擊的頻率如何?當用戶點擊時什麼是可接受的響應時間?我的目標設備每秒執行多少條Java指令?只有少量的指示才能確定哪個視圖是重要的?還要考慮你將要做的工作來處理點擊。計算OS內部的代碼,可以執行數千,數萬,甚至數十萬個java指令。我想你會看到這個去哪裏... – ToolmakerSteve

+0

是否可以同時使用它們,我的意思不僅是「實現View.OnClickListener」,還有「SetOnClickListener」 – Patzu

2

查看是所有小部件的超類和OnClickListener接口都屬於這個類。所有小部件都繼承這一點。 View.OnClickListener與OnClickListener相同。您將不得不重寫此偵聽器的onClick(View視圖)方法,以實現您想要的按鈕操作。

告訴安卓聽單擊事件窗口小部件,你需要做的:

widget.setOnClickListener(this); // If the containing class implements the interface 
// Or you can do the following to set it for each widget individually 
widget.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Do something here 
    } 
}); 

「查看」參數中的onClick()方法只是會讓Android知道,一個觀點已被點擊過。它可以是Button或TextView或其他東西。您可以爲每個小部件設置一個OnClickListener,或者僅僅讓包含所有這些小部件的類實現該接口。在這種情況下,您將爲所有窗口小部件提供一個通用的onClick()方法,您只需檢查傳入該方法的視圖的ID,然後將其與每個所需元素的ID匹配即可爲這個元素採取行動。

4

請注意,爲了簡單起見,我已參考僅第一代碼段即

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

setOnClickListener(View.OnClickListener l)是View類的公共方法。 Button類擴展了View類,因此可以調用setOnClickListener(View.OnClickListener l)方法。

setOnClickListener註冊一個回調,當點擊視圖(在你的情況下按鈕)時被調用。這個答案應該回答你的前兩個問題:

1. setOnClickListener在哪裏符合上面的邏輯?

Ans。它在按鈕被點擊時註冊一個回調。 (在下一段中詳細解釋)。

2.哪一個實際聽按鈕點擊?

Ans。 setOnClickListener方法是實際聽按鈕點擊的方法。

當我說它註冊了一個回調被調用,我的意思是它會運行View.OnClickListener l這是該方法的輸入參數。在您的情況下,它將被mCorkyListenerbutton.setOnClickListener(mCorkyListener);提到然後將執行內

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

移動上進一步提到onClick(View v)的方法中,OnClickListener是用於待調用的回調接口的定義,當你的情況的圖(按鈕)被點擊。簡單地說,當您單擊該按鈕時,將執行mCorkyListener(因爲它是OnClickListener的實施)中的方法。但是,OnClickListener只有一個方法是OnClick(View v)。因此,無論在點擊按鈕時需要執行的操作都必須在此方法中進行編碼。

現在你知道setOnClickListenerOnClickListener的含義,我相信你可以自己區分這兩者。第三項View.OnClickListener實際上是OnClickListener本身。您之前有View.的唯一原因是因爲程序開始時的import陳述存在差異。如果您只有import android.view.View;作爲進口說明,您將不得不使用View.OnClickListener。如果您提及以下任一進口對賬單: import android.view.View.*;import android.view.View.OnClickListener;您可以跳過View.並簡單地使用OnClickListener

相關問題