Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动到特定视图的顶部会导致片段中出现NPE吗?_Android_Android Fragments - Fatal编程技术网

Android 滚动到特定视图的顶部会导致片段中出现NPE吗?

Android 滚动到特定视图的顶部会导致片段中出现NPE吗?,android,android-fragments,Android,Android Fragments,我有一个活动和一个片段。我在活动中有两个按钮,单击这两个按钮,我将加载相同的片段。在第二个按钮上单击“我想滚动到textview的顶部位置”,片段将NestedScrollView作为其父级 我使用界面来区分单击了哪个按钮 interface HomeFragmentListener { fun shouldScrollToCampaign(scroll: Boolean) } class MainActivity : AppCompatActivity(),... { privat

我有一个活动和一个片段。我在活动中有两个按钮,单击这两个按钮,我将加载相同的片段。在第二个按钮上单击“我想滚动到textview的顶部位置”,片段将
NestedScrollView
作为其父级

我使用界面来区分单击了哪个按钮

interface HomeFragmentListener {
    fun shouldScrollToCampaign(scroll: Boolean)
}

class MainActivity : AppCompatActivity(),... {

private var homeFragmentListener: HomeFragmentListener? = null

    fun setHomeFragmentListener(homeFragmentListener: HomeFragmentListener? ){
       this.homeFragmentListener = homeFragmentListener
    }

}
下面是我的第二个按钮点击代码

loadFragment(HomeFragment())
homeFragmentListener?.shouldScrollToCampaign(true)
片段加载如下所示

private fun loadFragment(fragment: Fragment?) {
        val transaction = supportFragmentManager.beginTransaction()
        fragment?.let { transaction.replace(R.id.fl_activity_main, it) }
        transaction.commit()
    }
class HomeFragment : Fragment(), HomeFragmentListener {

   override fun shouldScrollToCampaign(scroll: Boolean) {
        if (scroll) {
            nestedScrollView {
                nsv_fragment_home.scrollTo(
                    0,
                    textView.top
                )
            }
        }
    }

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        (activity as MainActivity).setHomeFragmentListener(this)
..}

}
我的片段如下

private fun loadFragment(fragment: Fragment?) {
        val transaction = supportFragmentManager.beginTransaction()
        fragment?.let { transaction.replace(R.id.fl_activity_main, it) }
        transaction.commit()
    }
class HomeFragment : Fragment(), HomeFragmentListener {

   override fun shouldScrollToCampaign(scroll: Boolean) {
        if (scroll) {
            nestedScrollView {
                nsv_fragment_home.scrollTo(
                    0,
                    textView.top
                )
            }
        }
    }

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        (activity as MainActivity).setHomeFragmentListener(this)
..}

}

当加载片段时,我也在调用网络代码,只需删除侦听器的set方法,并在创建片段对象时初始化侦听器,然后将其转换到接口即可

尝试:

HomeFragment frg = HomeFragment()
homeFragmentListener = frg as HomeFragmentListener 
loadFragment(frg)
homeFragmentListener?.shouldScrollToCampaign(true)

如果该方法已附加到活动,则可以在片段中调用该方法。单击活动中的第二个按钮后,请尝试以下操作:

var homeFragment = supportFragmentManager.findFragmentById(R.id.fl_activity_main) as HomeFragment
homeFragment.scrolToTop()

在第二个按钮代码中,当调用
loadFragment(HomeFragment())
时,上一个片段现在被销毁。销毁片段的引用仍存储在
homeFragmentListener
中。因此,当调用实现接口的方法时,
textview
将为空。即使您替换到正确的实例,它仍然有100%的可能性失败,因为当您调用
shouldscrolldtocampaign

有两种方法可以解决此问题:

  • 移动按钮以分割和重新绘制需要更新的视图
  • 如果这是不可能的,或者需要太多的更改,那么在创建片段实例时通过bundle传递变量,并在加载数据后调用滚动函数

    class HomeFragment : Fragment() {
        companion object {
            private const val MY_BOOLEAN = "my_boolean"
    
            fun newInstance(aBoolean: Boolean) = HomeFragment().apply {
                arguments = Bundle(1).apply {
                    putBoolean(MY_BOOLEAN, aBoolean)
                }
            }
        }
    }
    

  • 这就是如何实例化您的
    HomeFragment
    并在
    onViewCreated
    方法中检查
    MY_BOOLEAN
    是否设置为true,并基于该滚动查看您想要滚动的视图。

    同一问题@AfinasEMI am获得textView的NPE您以前初始化过textView吗?是的,它在我的xml布局中定义。我还以编程的方式为它设置文本,它可以工作。我认为很难知道所提供的代码会发生什么。您是否可以包括onClick代码、活动和片段布局以及异常堆栈?您是否可以发布日志,其中包括用于发布日志的NPE.+2。