android - 如何更好地操作 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);
}
}
解决方案
推荐阅读
- python - Telethon 在转发时重复消息
- slack-api - 是否可以从 Slack 自动更新汇合页面?
- python - 时间数据与格式不匹配 - ValueError
- haskell - Haskell 如何终止递归调用并避免非穷举模式
- awk - 使用awk计算GSM消息变长码
- multithreading - ActiveMQ 线程
- node.js - 带有无限滚动的 Ionic 4+ 分页 rest api 搜索过滤器
- javascript - 访问 HTML5 音频响应标头
- highcharts - Highcharts - 可调整大小的 y 轴作为烛台和交易量图表的一个
- ios - SwiftUI 视图以蓝色背景显示