java - 在 fragment 状态适配器内的 fragment 之间滑动时,动画(textView)不断取消

标签 java android android-studio android-fragments android-viewpager2

  • 我正在 android studio (Java) 上开发一个应用
  • 我创建了一个 tabLayout,它使用 viewPager2 + Fragment State Adapter 在两个 fragment 之间滑动
  • 在fragment02上,我为textView设置了动画。
  • 当我滑动到 fragment 上时,动画会按其应有的方式循环播放。
  • 但是,如果我滑开 fragment 然后再滑开,动画将不再播放。
  • 我真的需要动画继续。

欢迎任何建议,我提前感谢您:)

请注意,我对此还很陌生。

// MainActivity.java

package Zoomie.App;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportActionBar().setTitle("Welcome");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        ViewPager2 viewPager2 = findViewById(R.id.ViewPager);
        viewPager2.setAdapter(new FragmentPagerAdapter(this));

        TabLayout tabLayout = findViewById(R.id.tabLayout);
        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(
                tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {

            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {

                switch (position) {
                    case 0: {
                        tab.setText("Fragment 01");
                        break;
                    }
                    default: {
                        tab.setText("Fragment 02");
                        break;
                    }
                }
            }
        });
        
        tabLayoutMediator.attach();
    }
}

// FragmentPagerAdapter.java

package Zoomie.App;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

public class FragmentPagerAdapter extends FragmentStateAdapter {

    public FragmentPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        switch (position){
            case 0:
                return new Fragment01();
            default:
                return new Fragment02();
        }
    }

    @Override
    public int getItemCount() {
        return 2;
    }
}

// Fragment02.java 

package Zoomie.App;

import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

public class Fragment02 extends Fragment {

    public Fragment02() {
    }

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

        View rootView=inflater.inflate(R.layout.fragment_02, container, false);

        TextView fade01 = (TextView) rootView.findViewById(R.id.textView_fade_01);
        Animation fade = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_animation);
        fade01.startAnimation(fade);

        return rootView;
    }
}

// fade_animation.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:fromAlpha="0"
        android:toAlpha=".5"
        android:duration="375"
        android:repeatMode="reverse"
        android:repeatCount="infinite"
        />
        
</set>

最佳答案

您应该将加载动画方法移至 onResume() 生命周期方法中。对于您的情况:

private TextView fade01;

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

    View rootView = inflater.inflate(R.layout.fragment_02, container, false);

    fade01 = (TextView) rootView.findViewById(R.id.textView_fade_01);

    return rootView;
}

@Override
public void onResume() {
    super.onResume();
    Animation fade = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_animation);
    fade01.startAnimation(fade);
}

关于java - 在 fragment 状态适配器内的 fragment 之间滑动时,动画(textView)不断取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60196379/

相关文章:

Java:将对象保存在文本文件中?有现成的解决方案吗?

java - 在java servlet中存储用户特定数据?

java - 如何在 spring boot 中拥有线程安全 Controller

java - IndexOutOfBoundsException 后检查

javascript - 出现键盘时如何在Android中处理网站

android - Gradle DSL 找不到源()

java - 带有渐变: Package r does not exist的Android Studio

android - 有 Intent 地开始一项 Activity 并获得引用

java - 将收到的数据记录到 txt 文件

android - 如何在 Flutter 的 ListView 项目中使用 Showcase View?