Подтвердить что ты не робот

OnClick внутри фрагмента, вызванного активностью

Я инкапсулирую материал в фрагмент на данный момент и сталкиваюсь с проблемой, которая трудно для Google. Внутри моего фрагмента есть несколько кнопок с атрибутами onClick, но они вызываются в Activity скорее как фрагмент из системы Android - это делает инкапсуляцию немного неуклюжей. Есть ли способ, чтобы объекты отражения от onClick вызывали фрагмент? Единственное решение, которое я вижу на данный момент, это не использовать onClick в xml и устанавливать клик-прослушиватели внутри фрагмента с помощью кода.

4b9b3361

Ответ 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;