Android добавил Фрагмент на экран, но касания падают через новый вид Фрагмента к предыдущему - PullRequest
1 голос
/ 21 февраля 2012

Я работаю с Фрагментами впервые и сталкиваюсь со странным поведением. У меня есть действие с фрагментом, охватывающим весь вид. Он содержит ListView. Когда я нажимаю на элемент в ListView, я хочу показать фрагмент сведений, который содержит информацию об этом элементе.

Вот как я представляю новый фрагмент:

FragmentManager fragmentManager = this.getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

DetailsFragment fragment = new DetailsFragment();
transaction.add(R.id.viewRoot, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .addToBackStack("Details").commit();

R.id.viewRoot - это идентификатор корневого макета в XML-макете первого фрагмента, поэтому новый фрагмент заполняет весь экран.

Моя проблема: когда новый фрагмент виден и покрывает весь экран, любые щелчки или нажатия, которые попадают на фон (т.е. не нажимая кнопку или текстовое поле на новом фрагменте), по-видимому, проходят через вид и приземляются на первый фрагмент. Итак, я нажимаю на элемент ListView, что приводит к добавлению DetailsFragment на экран. Затем, когда я нажимаю на фон DetailsFragment, этот каскад проваливается и попадает в ListView, вызывая добавление другого DetailsFragment для любого элемента, который случайно попал за кулисы.

Я неправильно добавляю свой новый фрагмент? Почему мои клики / нажатия проваливаются?

РЕДАКТИРОВАТЬ для caiuspb:

public class BaseFragment extends Fragment {

    public void pushNewFragment(Fragment fragment, String description) {
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        transaction.remove(this);
        transaction.add(R.id.viewRoot, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .addToBackStack(description).commit();
    }

}

Все мои фрагменты расширяют мой класс BaseFragment.

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Я экспериментировал с предложениями, которые получил, но ни одно из них не сработало. В конце концов, я решил добавить OnTouchListener к корневому представлению моих подфрагментов, которое отбросило все касания.

View view = inflater.inflate(R.layout.mylayout, container, false);
view.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});
0 голосов
/ 22 февраля 2012

В StackOverflow есть еще один пост об этом странном поведении фрагмента. Попробуйте удалить свой фрагмент, прежде чем добавить его, потому что метод замены, кажется, глючит

редактирование: Переместите логику фрагмента в свою активность, потому что ваша деятельность содержит ваши фрагменты. Сегодня я попытался использовать FragmentActivity и Fragments из библиотеки поддержки Android. Теперь я могу использовать метод замены без каких-либо ошибок. Это мой подход, и это работает:

public class DashActivity extends FragmentActivity{
...
private void changeRightFragment(Fragment fragment) {
        Log.i(TAG, "Loading Fragment into container: " + fragment.getClass().toString());
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.rightfrag, fragment);
        // Add a transition effect
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        // Add the Fragment to the BackStack so it can be restored by
        // pressing the Back button
        ft.addToBackStack(null);
        ft.commit();
    }
    ...
public void setUserFragment(User user) {
    UserFragment fragment = new UserFragment(user);
    changeRightFragment(fragment);
}

Так что, если вы хотите вызвать метод changeFragment из вашего фрагмента, используйте механизм обратного вызова для Activity

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...