首页 > 解决方案 > 如何更好地操作 viewpager2 与方向变化的布局变化片段?

问题描述

大家好,我的 android 应用程序有问题。我努力理解它,但我无法完全理解,找到解决方案需要多少钱。我的主要活动是 viewpager2 和 FragmentStateAdapter,另外我还有一个 tablayout。如果我的应用程序以纵向或横向开始,我的应用程序就可以正常工作。尽管事情变得混乱,但在方向改变时。更具体地说,当我尝试在我的片段上引用视图时,在方向更改之后,会引发空引用异常。我的片段是通过编辑器使用布局变化构建的。另一个细节是片段是动态添加的。一个可能的解释是,在方向改变之后,主要活动以及片段正在重新创建,因此他们的视图/布局被显示,但实际上支持经理在方向改变之前仍然持有片段的 id。对不起,如果我的解释缺乏,并提前感谢您对此事的任何可能的建议。

主要活动

    public class MainActivity extends BaseActivity implements View.OnClickListener , EnterDataFragment.NotifyActivity {

    MainFragmentsAdapter pagerAdapter;
    ViewPager2 viewPager;
    TabLayout tabs;
    TabLayoutMediator tabLayoutMediator;
    String[] titles =  {"Enter Data" , "Results" };
    ExpandableFabLayout fabLayout;
    FabOption clearFab;
    FabOption calculateFab;
    EnterDataFragment dataFragment;
    ResultsFragment resultsFragment;


    private int shortAnimationDuration;

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
    }

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

        SetupViews();
        SetUpAdapter();

        tabLayoutMediator = new TabLayoutMediator(tabs, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                //position of the current tab and the tab
                tab.setText(titles[position]) ;
                viewPager.setCurrentItem(position, true);

            }
        });

        tabLayoutMediator.attach();

        viewPager.setCurrentItem(0,true);

        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

               if(tab.getPosition() == 1 ){
                   fabLayout.animate()
                           .alpha(0f)
                           .setDuration(shortAnimationDuration)
                           .setListener(new AnimatorListenerAdapter() {
                               @Override
                               public void onAnimationEnd(Animator animation) {
                                   fabLayout.setVisibility(View.INVISIBLE);
                               }
                           });

                   //fabLayout.setVisibility(View.INVISIBLE);
               }
               else{
                   fabLayout.setAlpha(0f);
                   fabLayout.setVisibility(View.VISIBLE);
                   fabLayout.animate()
                           .alpha(1f)
                           .setDuration(shortAnimationDuration)
                           .setListener(null);

               }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

    private void SetupViews(){
        viewPager = findViewById(R.id.viewPager);
        tabs = findViewById(R.id.tabLayout);
        fabLayout = findViewById(R.id.expandable_fab_layout);
        clearFab = findViewById(R.id.fabClear);
        clearFab.setOnClickListener(this);
        calculateFab = findViewById(R.id.fabCalculate);
        calculateFab.setOnClickListener(this);
        shortAnimationDuration =  getResources().getInteger(android.R.integer.config_shortAnimTime);
    }

    private void SetUpAdapter(){
        dataFragment = new EnterDataFragment();
        dataFragment.AttachListener(this);
        resultsFragment = new ResultsFragment();
        pagerAdapter = new MainFragmentsAdapter(getSupportFragmentManager(),getLifecycle());
        pagerAdapter.clearList();
        pagerAdapter.addFragment(dataFragment);
        pagerAdapter.addFragment(resultsFragment);
        viewPager.setAdapter(pagerAdapter);
    }

    private void ClearAllFields(){
        dataFragment.ClearAllFields();
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.fabClear:
                Toast.makeText(this,"CLEAR",Toast.LENGTH_LONG);
                ClearAllFields();
                break;
            case R.id.fabCalculate:
                gatherInputs();
                break;
        }
    }

    private void gatherInputs(){
        dataFragment.GatherInputs();

    }

    @Override
    public void DatasetLoaded(List<AquachronStage> dataset) {
        resultsFragment.UpdateDataset(dataset);
    }

    @Override
    protected void setUpView() {

    }

    @Override
    protected void InitializePresenter() {

    }

}

适配器

  public class MainFragmentsAdapter extends FragmentStateAdapter {

    private ArrayList<Fragment> fragmentList = new ArrayList<>();

    public MainFragmentsAdapter(@NonNull FragmentManager fragmentActivity, Lifecycle lifecycle) {
        super(fragmentActivity,lifecycle);

    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }


    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);

    }

    public void clearList(){
        for (Fragment fr: fragmentList
             ) {
            fragmentList.remove(fr);
            notifyItemRemoved(fragmentList.indexOf(fr));
        }
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);

    }
}

标签: androidandroid-fragmentsscreen-orientationandroid-viewpager2orientation-changes

解决方案


推荐阅读