Android ImageButton останавливается после изменения фрагментов - PullRequest
1 голос
/ 16 апреля 2020

Я создаю приложение, используя Android Studio, где вы можете прослушать скачанные файлы musi c и загрузить файлы musi c в облако. В настоящее время я пытаюсь сделать кнопку для добавления плейлиста. Вот фрагмент дома, в котором расположена кнопка добавления:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Home Fragment"
        android:textSize="30sp" />

    <ImageButton
        android:id="@+id/new_playlist"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="32dp"
        android:layout_marginBottom="32dp"
        android:background="@drawable/shadow"
        android:elevation="10dp"
        android:src="@drawable/ic_new" />

</RelativeLayout>

Как видно выше, кнопка является значком ImageButton. Вот код для добавления события onClick:

@Override
protected void onStart() {
    super.onStart();

    ImageButton imgBtn = findViewById(R.id.new_playlist);
    imgBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new NewPlaylistFragment()).commit();
        }
    });

}

Это прекрасно работает, отображая NewPlaylistFragment. Проблема в том, когда я использую меню навигации и нажимаю на домашний фрагмент. При попытке нажать кнопку нового плейлиста во второй раз, ничего не происходит. При замене фрагмента простым сообщением Toast он срабатывает каждый раз, когда я нажимаю кнопку. Проведя дополнительное исследование, я обнаружил, что переход к фрагменту профиля и возврат к фрагменту home делает новую кнопку списка воспроизведения бесполезной, независимо от кода внутри функции onclick. В случае, если это поможет, вот код для перенаправления навигации:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    switch (item.getItemId()) {
        case R.id.nav_home:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new HomeFragment()).commit();
            break;
        case R.id.nav_profile:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new ProfileFragment()).commit();
            break;
        case R.id.nav_email:
            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"person@example.com"});
            startActivity(emailIntent);
            break;
    }
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

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

Редактировать

Я попытался добавить onClick при создании нового фрагмента домашнего объекта, но проблема все еще сохраняется.

1 Ответ

1 голос
/ 16 апреля 2020

Вы findViewById(R.id.new_playlist) с первого экземпляра HomeFragment. Вы должны найти его (и setOnClickListener) каждый раз, когда создаете новый экземпляр.

case R.id.nav_home:
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.fragment_container, new HomeFragment())
            .commit();
    imgBtn = findViewById(R.id.new_playlist);
    imgBtn.setOnClickListener(onClickListner);
    break;

Выше быстрое решение. Но в идеале, я думаю, вы не должны обрабатывать обнаружение Button и setOnClickListener в вашем Activity, а в вашем HomeFragment классе.

Кроме того, каждый раз о вашем коде R.id.nav_home или R.id.nav_profile выбран, новый HomeFragment или новый ProfileFragment будет создан.

Чтобы избежать множественного появления фрагмента, используйте тег String и findFragmentByTag ( или findFragmentById).

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment homeFragment = fragmentManager.findFragmentByTag(HomeFragment.TAG);
if (homeFragment == null) {
    homeFragment = new HomeFragment();
}
fragmentManager
        .beginTransaction()
        .replace(R.id.fragment_container, homeFragment, HomeFragment.TAG)
        .addToBackStack(null)
        .commit();

(В приведенном выше примере HomeFragment.TAG представляет собой строковую константу (stati c final String).

...