gpt4 book ai didi

java - 在 fragment 中的 ConfigurationChange 之后,onClickListener 无法(正确)工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:40 24 4
gpt4 key购买 nike

介绍

呵呵,这是坚韧一。至少,我是这么认为的……
清理事情:

I did not find any answers to my question after searching the internet (using Google).



我发现的一切都是关于人们设置 onClickListener为他们的 View错了。我想在我的情况下这是同样的问题,但没有其他问题与我的匹配。

This似乎是同样的问题......它没有答案。

设置

我有三个 FragmentViewPager 一起设置在我的 AppCompatActivity .
viewPager = (ViewPager) findViewById(R.id.main_view_pager);
viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));

SectionsPagerAdapter 处理.
public class SectionsPagerAdapter extends FragmentPagerAdapter {

SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return MainTextHolder.newInstance(tabIndicatorOnClick);
case 1:
return PostWriter.newInstance(tabIndicatorOnClick);
case 2:
return TopPage.newInstance(tabIndicatorOnClick);
default:
return Error.newInstance();
}
}

@Override
public int getCount() {
return 3;
}

// ... more methods
}

在每个 Fragment的我有一些内容加上自定义 TabIndicator .

(以下 xml 文件是我的 View 的指标)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<View
android:id="@+id/fragment_divider_one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="one" />

<View
android:id="@+id/fragment_divider_two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="two" />

<View
android:id="@+id/fragment_divider_three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="three" />

</LinearLayout>

然后我设置了 OnClickListener对于每一个 View Fragment 中的(分隔符)的 onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState)方法。 OnClickListener我的 Activity中已经准备好了我还实例化了我的 ViewPager这样我就可以更改当前的 Item ( Fragment/tab)。
private final View.OnClickListener tabIndicatorOnClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getTag().toString().equals("one"))
viewPager.setCurrentItem(0, true); // second argument for smooth transition
else if (view.getTag().toString().equals("two"))
viewPager.setCurrentItem(1, true);
else if (view.getTag().toString().equals("three"))
viewPager.setCurrentItem(2, true);
}
};

我通过了 OnClickListenerFragment把它放进我的 newInstance(View.OnClickListener tabIndicatorOnClick)方法。

This is for one of the fragments. It is identical for the others!


public static MainTextHolder newInstance(View.OnClickListener tabIndicatorOnClick) {
MainTextHolder fragment = new MainTextHolder();
Bundle args = new Bundle();
fragment.putIndicatorTabIndicatorOnClick(tabIndicatorOnClick);
fragment.setArguments(args);
fragment.setRetainInstance(true);
return fragment;
}

我的 putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick)方法是 VoidInterface .它只是应用 OnClickListenerClass ( Fragment)。
@Override
public void putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick) {
this.tabIndicatorOnClick = tabIndicatorOnClick;
}

行得通吗

是的,它确实。它工作得非常好...直到 ConfigurationChange发生。就我而言,我通过改变方向对其进行了测试。

问题

之后会发生什么 ConfigurationChange是一切正常。 OnClickListener应用于 全部 View位于 全部 Fragment的, 但是 tabIndicatorOnClick OnClickListener是第二个和第三个 Fragment 中的空对象引用.

所以在 PostWriter 和 TopPage 中甚至没有真正的 OnClickListenerView是什么原因。但它变得更好:在 MainTextHolder Fragment tabIndicatorOnClick不是 null object reference ,但不会改变 ViewPagerItem了。它运行代码,但不滚动 Tab .

打开“不保留 Activity ”时,ind 开发者选项 设备并离开应用程序,全部 OnClickListenernull object references .即使是 MainTextHolder 中的那些.

概括

ConfigurationChange 之后 OnClickListener被传递到我的第一个 Fragment ,但它无法正常工作,并且在剩余的 Fragment 中它甚至没有通过/a null object reference .

可以通过销毁 Activity 来复制该问题。然后重新加载它。

到底...

...我不知道出了什么问题。我希望我的问题结构正确。

可能感兴趣

minSdkVersion: 14

targetSdkVersion: 25



我已经有一个 SpringIndicator在我的 ViewPager .这没有 OnClickListener所以我添加了我自己的“叠加”指标,这些指标具有所需的 OnClick特征。我也喜欢它的外观,但如果你能给我一个更好的解决方案,我的 TabIndicator ,我也很想得到这个答案。

我遇到了将方法放入 xml 的解决方案 :onClick属性多次,但为此我需要创建相同的 OnClickListener对于每个 Fragment这不是真正的好方法,它也没有解决我的问题,而是一种解决方法。 - 我需要通过 ViewPager进入我的 Fragment然后从 xml 调用该方法正如我所说,这只是另一种方式,而不是我喜欢的方式。另外我不知道它是否有效。我很可能会测试它。

其他 OnClickListener位于 Fragment仍然可以正常工作。所以正如我所说,问题在于 OnClickListener本身无法正常工作/成为 null object reference .

最佳答案

首先,很好地编写了问题的详细描述。 StackOverflow 上的许多提问者都可以从这个问题表达问题的能力中学习。

此错误似乎来自未考虑 Fragment 生命周期更改。在 ViewPager 中,Fragment 会经历各种状态,包括在暂时离屏时隐藏和显示,在离屏和系统释放内存时暂停和恢复,最后在 Android 系统决定保存实例状态时创建和销毁您的 Activity (例如来自配置更改)。在后一种情况下,Android 将尝试从 ViewPager 中保存的实例状态恢复 Fragments 的状态。由于您的 Fragments 无法保存 View.OnClickedListener它们在参数中传递,最终得到 null恢复它们时的指针,这会导致您的错误。

要修复错误,我建议您不要通过 View.OnClickedListener作为 fragment 的参数。相反,公开OnClickListener通过您的 Activity 中的公共(public)方法到您的 Fragments 并让 Fragments 在他们的 onResume() 中自己获取它.这样,您可以保证 Fragments 将引用 View.OnClickedListener每当它们处于恢复状态时。所以你的onResume()可能看起来像这样:

@Override
public void onResume() {
OnClickListener onClickListener = ((MyActivity) getActivity).getOnClickListener();
putIndicatorTabIndicatorOnClick(onClickListener);

}

由于您已将其设置在 onResume() ,您应该在 onPause() 中删除它:
@Override
public void onPause() {
//set the onClickListener to null to free up the resource
}

使用 onResume()onPause()像这样从监听器中释放资源是开发人员指南中推荐的方法。

当然,您必须通过检查 onCreate(Bundle savedInstanceState) 中的已保存状态来确保您的 Activity 也处理自己的生命周期。并适本地恢复它。

请注意,保存实例状态和恢复可以通过多种方式触发:
  • 配置状态改变(比如旋转手机,导致 Activity 横向而不是纵向显示
  • 设备内存不足(例如,如果最近的应用中有大量 Activity )
  • 打开开发人员选项/不要保留 Activity 并使用主页将您的应用程序放在最近的应用程序中,然后导航回您的应用程序。

  • 您将能够使用其中一种方法来确定您是否正确处理了 Activity 和 fragment 的生命周期。

    关于java - 在 fragment 中的 ConfigurationChange 之后,onClickListener 无法(正确)工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41528197/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com