Мой onClickListener не вызывается, когда я меняю страницы во фрагменте - PullRequest
0 голосов
/ 22 февраля 2020

В моем фрагменте у меня есть три элемента управления: два ImageViews и Button:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:id="@+id/rel_layout"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="#ffffffff"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/heading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:textStyle="bold"
        android:visibility="visible"
        android:textSize="25sp"
        android:layout_marginTop="10dp"
        android:layout_marginStart="10dp" />

    <ImageView
        android:id="@+id/forward"
        android:background="@drawable/chevronright"
        android:layout_below="@+id/heading"
        android:layout_alignParentEnd="true"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <ImageView
        android:id="@+id/back"
        android:background="@drawable/chevronleft"
        android:layout_below="@+id/heading"
        android:visibility="invisible"
        android:layout_alignParentStart="true"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <Button
        android:id="@+id/skip_button"
        android:text="@string/skip_button"
        style="?android:attr/buttonBarButtonStyle"
        android:layout_below="@+id/back"
        android:layout_alignParentStart="true"
        android:textStyle="bold"
        android:layout_alignParentBottom="true"
        android:gravity="bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/heading" >

    <TextView
        android:id="@+id/body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="normal"
        android:visibility="visible"
        android:textSize="20sp" />

    </LinearLayout>
</RelativeLayout>

Во фрагменте я определяю onClickListeners для всех трех элементов управления:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    SharedPreferences sharedPref = getActivity().getSharedPreferences("WDWHIC settings", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("lastPage", INTRO);
    editor.commit();

    View view = inflater.inflate(R.layout.fragment_intro, container, false);

    ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(R.string.intro_page_full);

    RelativeLayout topLayout = getActivity().findViewById(R.id.topLayout);
    topLayout.setVisibility(View.INVISIBLE);

    final Animation in = new AlphaAnimation(0.0f, 1.0f);
    in.setDuration(500);

    RelativeLayout rel_layout = view.findViewById(R.id.rel_layout);

    Resources res = getResources();

    pages = res.getStringArray(R.array.pages_array);

    heading = rel_layout.findViewById(R.id.heading);
    heading.setText(pages[pageNum]);

    forward = rel_layout.findViewById(R.id.forward);
    forward.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            back.setVisibility(View.VISIBLE);
            pageNum += 2;
            heading.setText(pages[pageNum]);
            body.startAnimation(in);
            body.setText(pages[pageNum + 1]);
            body.scrollTo(0, 0);
            if (pageNum == 2 * MAX_PAGES) forward.setVisibility(View.INVISIBLE);
        }
    });

    back = rel_layout.findViewById(R.id.back);
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            forward.setVisibility(View.VISIBLE);
            pageNum -= 2;
            heading.setText(pages[pageNum]);
            body.startAnimation(in);
            body.setText(pages[pageNum + 1]);
            body.scrollTo(0, 0);
            if (pageNum == 0) back.setVisibility(View.INVISIBLE);
        }
    });

    skip = rel_layout.findViewById(R.id.skip_button);
    skip.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditProfileFragment editProfileFragment = new EditProfileFragment();
            FragmentManager manager = getActivity().getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.fragment_container, editProfileFragment, editProfileFragment.getTag()).commit();
            getActivity().overridePendingTransition(R.anim.fadein, R.anim.fadeout);
        }
    });

    body = rel_layout.findViewById(R.id.body);
    body.startAnimation(in);
    body.setText(pages[pageNum + 1]);
    body.setMovementMethod(new ScrollingMovementMethod());

    return view;
}

Если я нажимаю кнопку 'skip' на первой странице, вызывается ее метод onClick (). Но если я нажму на вперед или назад, это не произойдет, если я не вернусь на первую страницу. Что с этим? Почему продвигающиеся страницы должны иметь значение?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2020

Я бы попробовал установить функциональность onClickListener в классе, который расширяет FragmentActivity.

В классе, который реализует ваш метод onCreateView, определите обработчик stati c и инициализируйте его обработчиком stati c, который должен быть определен в классе, который расширяет FragmentActivity.

из класс, который реализует onCreateView, создает сообщение android для отправки обработчику stati c вашего класса, который расширяет FragmentActivity. В этом сообщении отправьте объект, который является вашей кнопкой для реализации onClickListener. Примечание. Создайте и отправьте это сообщение изнутри вашего onCreateView.

Как только сообщение получено внутри класса, который расширяет FragmentActivity, отправьте объект, который поступает в сообщении (это представление, которое фактически является вашей кнопкой), как параметр для закрытого метода, который находится внутри вашего класса и расширяет FragmentActivity.

Внутри этого частного метода попытайтесь установить функциональность onClickListener.

0 голосов
/ 22 февраля 2020

Я не знаю, почему это должно работать, но я переместил кнопку над заголовком, ничего не меняя, и теперь onClick () вызывается с каждой страницы.

<Button
    android:id="@+id/skip_button"
    android:text="@string/skip_button"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_alignParentEnd="true"
    android:textStyle="bold"
    android:layout_marginTop="10dp"
    android:layout_alignParentTop="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/heading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/skip_button"
    android:textStyle="bold"
    android:visibility="visible"
    android:textSize="25sp"
    android:layout_marginStart="10dp" />

enter image description here

0 голосов
/ 22 февраля 2020

Попробуйте добавить android:clickable="true" к вашим изображениям.

В документации:

android: clickable Определяет, реагирует ли это представление на события нажатия.
https://developer.android.com/reference/android/view/View#attr_android: clickable

Следовательно, теоретически, onClickListener View не будет срабатывать, если для clickable не задано значение true.

...