2015-10-13 4 views
1

У меня довольно простой экран, который имеет только 4 кнопки. Я его реализации как фрагмента, как так:Фрагмент с кнопками: onClick() vs. XML onClick

public class MainFragment extends Fragment implements View.OnClickListener { 
    // ... 

    @Override 
    public void onClick(View view) {} 
} 

Каждая кнопка уже onClick указано на функцию в деятельности, которая прилагается фрагмент. Проблема, с которой я сталкиваюсь, заключается в том, что функции onClick не вызывается при нажатии кнопок. Я оставил MainFragment.onClick() пустым - но это правильный подход? Нужно ли выполнять функции для вызова функций? Если это так, атрибуты onClick в макетах кнопок выглядят излишними.

Любая помощь будет оценена по достоинству.

Благодаря

+0

'onClick' в XML только вызовет методы в' Activity', а не в 'Fragment'. Часто это не очень полезно. Что вы делаете, все в порядке, вам не нужен атрибут XML 'onClick'. Вы можете использовать обратный вызов для связи с вашей «Деятельностью», если это необходимо, но вам этого не нужно. Если вы можете обрабатывать нажатие кнопки только в «Фрагмент», это тоже хорошо. –

+1

Если вы оставите его пустым, он ничего не сделает, конечно. Если вам нужно общаться с «Деятельностью», сделайте то, что говорит @meda. Нужно ли вам общаться с «Деятельностью» или нет, я не могу сказать вам, это зависит от того, что вы пытаетесь сделать. –

ответ

1

FWIW Я никогда не использовать xmlonClick атрибуты. Хотя они могут сохранить несколько строк ввода, они затрудняют отслеживание того, что происходит в вашем коде.

Если ваш класс implementsView.OnClickListener и вы правильно перекрываться в onClick метод (который он выглядит, как у вас есть), то вы можете безопасно удалить любые onClick с в ваших layout файлов и вместо того, чтобы назначать методы к кликам виджета следующим образом :

public class MainFragment extends Fragment implements View.OnClickListener { 
    private Button viewOne, viewTwo, viewThree; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.your_layout, container, false); 

     viewOne = (Button) rootView.findViewById(R.id.view_one); 
     viewTwo = //etc... 

     //"this" refers to the current object. As the object is of a class that implements OnClickListener, 
     //passing "this" satisfies the View.OnClickListener parameter required for the setOnClickListener() method. 
     viewOne.setOnClickListener(this); 
     viewTwo.setOnClickListener(this); 
     viewThree.setOnClickListener(this); 

     return rootView; 
    } 


    @Override 
    public void onClick(View view) { 
     //To identify the correct widget, use the getId() method on the view argument 
     int id = view.getId(); 
     switch (id) { 
      case R.id.view_one: 
       //viewOne clicked 
       break; 
      case R.id.view_two: 
       //And so on... 
     } 
    } 
} 
2

Правильный подход заключается в использовании фрагмента слушателя общаться назад с деятельностью:

public static class MainActivity extends Activity 
     implements MainFragment.onFragmentInteraction{ 
    ... 

    public void onFragmentInteraction() { 
     // Do something 
     callFunction(); 
    } 
} 

Затем в фрагменте:

mYourButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(); 
     } 
    } 
}); 
+0

Означает ли это, что атрибут XML 'onClick' не должен использоваться? – Kar

+0

Я не знаю, возможно, это сработает, но я никогда этого не делаю, я предпочитаю это в своем коде – meda

1

Если вы установите onClick в ваш XML, события click перейдут в ваш контейнер Activity. Но вы можете иметь события щелчка прямо в ваш фрагмент, установив onClickListener на реализацию Фрагмента. Таким образом, в onCreateView() методы вашего фрагмента, вы бы раздуть макет, а затем установить кнопки onClickListener для реализации вашего фрагмента, как это ...

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.your_fragment, container, false); 
    Button button = (Button) view.findViewById(R.id.your_button); 
    button.setOnClickListener(this); 
    return view; 
} 

Устанавливая setOnClickListener() к this, вы отправляете все событие нажатия этой кнопки к вашему фрагменту, а не к вашей деятельности. Тогда вы просто обрабатывать ваши onClick события, как вы уже делаете ...

@Override 
public void onClick(View view) { 
    Log.d("YOUR BUTTON", "This is called from your Fragment instead of your Activity"); 
} 
Смежные вопросы