Я инкапсулирую материал в фрагмент на данный момент и сталкиваюсь с проблемой, которая трудно для Google. Внутри моего фрагмента есть несколько кнопок с атрибутами onClick, но они вызываются в Activity скорее как фрагмент из системы Android - это делает инкапсуляцию немного неуклюжей. Есть ли способ, чтобы объекты отражения от onClick вызывали фрагмент? Единственное решение, которое я вижу на данный момент, это не использовать onClick в xml и устанавливать клик-прослушиватели внутри фрагмента с помощью кода.
OnClick внутри фрагмента, вызванного активностью
Ответ 1
Я поговорил с некоторыми googlers @# adl2011 - они распознают проблему и, возможно, в будущем будет исправлено это. До тех пор - нужно использовать .setOnClick во Фрагменте.
Ответ 2
Проблема заключается в том, что когда макет раздувается, он все еще является хостинговой операцией, которая получает нажатие кнопки, а не отдельные фрагменты.
Я предпочитаю использовать следующее решение для обработки событий onClick. Это также работает для Activity и Fragments.
public class StartFragment extends Fragment implements OnClickListener{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_start, container, false);
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.StartButton:
...
break;
}
}
}
Тогда проблема исчезла.
Ответ 3
Это работает для меня
Добавить импорт:
import android.view.View.OnClickListener;
Fragment.java
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = (ViewGroup) inflater.inflate(R.layout.fragment, container, false);
Button mButton = (Button) rootView.findViewById(R.id.button);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
}
});
return rootView;
}
Ответ 4
ВОПРОС:
1. В атрибуте XML onClick будет вызываться активный метод активности.
2. Необработанный общедоступный метод.
3. Повторное использование фрагментов.
РЕШЕНИЕ:
В Макет фрагмента добавьте его в представление.
android:onClick="onFragmentViewClick"
В каждой активности фрагмент может принадлежать..
public void onFragmentViewClick(View v) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (fragment != null && fragment.isVisible()) {
if (fragment instanceof SomeFragment) {
((SomeFragment) fragment).onViewClicked(v);
}
}
}
В Фрагмент включите этот метод.
public void onViewClicked(View v) {
switch (v.getId()) {
case R.id.view_id:
Log.e("onViewClicked", "yehhh!!");
break;
}
}
Ответ 5
У вас может быть слушатель, который вызывается в операции, переадресовывает вызов на прослушиватель в фрагменте. Вы должны иметь ссылку на фрагмент внутри FragmentActivity для передачи вызова. Вам нужно будет выполнить вызов для вызова метода или реализовать фрагмент интерфейса, который вы определяете. Я знаю, что это не лучшее решение, но оно будет работать. Вы также можете использовать тег кнопки, чтобы указать имя метода для вызова, если хотите. Надеюсь, это немного помогает.
Ответ 6
Попробуйте это...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.activity_ipadditional_users, container, false);
FloatingActionButton button7 = (FloatingActionButton) rootView.findViewById(R.id.fab_ip_additional_user);
button7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), IPAdditionalUsersEdit.class);
startActivity(intent);
}
});
return rootView;