2017-02-23 66 views
3

我剛剛開始學習關於片段的知識,並且我已經完成了1000多行代碼轉換爲片段的活動。聽取片段內部的活動按鈕點擊

我想知道是否有任何簡單的方法來允許我的片段聽住它的父活動的XML中的按鈕。我嘗試在片段的onCreateView中添加一個按鈕ID的常規偵聽器,但它(預計)會給我一個空指針異常。

我知道OnSearchClickListener這樣做的方法,但它可能需要很多小時的手動重構來實現我需要的東西(至少從我可以告訴它的用法,我很樂意成爲錯誤),所以我想知道是否有人知道任何其他方法以非重複的方式完成此操作。

+0

落實活動和片段之間的通信接口。請參閱:http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/ – nnn

+0

您可以使用接口來實現此目的。讓您的Fragment實現界面並覆蓋界面方法以執行您所需的功能。 – Bhargav

回答

4

你可以嘗試獲得活動的看法參考這種方式:

View view = getActivity().findViewById(R.id.view_in_activity); 

然後添加監聽器:

view.setOnClickListener(new OnClickListener() { 
    void onClick(View v) { 
     // Perform some action 
    } 
}) 
+0

這是對我的問題的正確答案,儘管我從別的答案中瞭解了其他形式的活動 - 片段通信(接口)(謝謝大家)。 – Zuhayr

2

定義一個名爲像ClickListenerOnActivity接口包含一個名爲onClickInActivity(View v)和實施方法在片段中。當點擊活動中的按鈕時調用界面的這個方法。

您可以查看此example以瞭解如何實現接口。

1

儘管埃姆雷Akturk的答案是沒有錯,但它不是最好的做法,因此,你可以將你的Fragment另一個Activity,之後,該Activity可能沒有View。所以,最好的方法是使用interface。使您的Fragment實現您所需的接口,然後在ButtononClickListener中調用該Fragment的接口。

4

在片段做出這樣的..

public class Myfragment extends Fragment { 

    public interface Callback { 
     public void onButtonClicked(View radiobtn); 
    } 

    private Callback callback; 

    @Override 
    public void onAttach(Activity ac) { 
     super.onAttach(ac); 
     callback = (Callback) ac; 
    } 

    @Override 
    public void onDetach() { 
     callback = null; 
     super.onDetach(); 
    } 

    radiobtn.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      if (callback != null) { 
       callback.onButtonClicked(view); 
      } 
     } 
    }); 
} 

在活動做這樣的...

public class Myfragment extends Activity implements MyFragment.Callback{ 

    public void onButtonClicked(View btn) { 
     // The radiobutton in MyFragment has been clicked 
     myButton.setEnabled(true); // or something like this. 
    } 
}