这是我的片段类:
公共类StanzeFragment扩展了Fragment {
public StanzeFragment(){}
Button vis_stanze;
public TextView testo;
View rootView;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.activity_log_stanze, container, false);
testo = (TextView) rootView.findViewById(R.id.testo);
vis_stanze = (Button)rootView.findViewById(R.id.bottone_stanze);
vis_stanze.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
getStanze backgroundTask = new getStanze();
backgroundTask.execute();
}
});
return rootView;
}
public void setTesto(String value){
testo.setText(value);
}
}
但现在我需要调用方法" setTesto"在其他类(AsyncTask类)中,在onPostExecute方法中:
@Override
protected void onPostExecute(String result) {
StanzeFragment test = new StanzeFragment();
test.setTesto(result);
}
他给我这个错误:
" java.lang.NullPointerException:尝试调用虚方法' void com.androidnuovosa.bocci.navdriwerdb.Utente.StanzeFragment.setTesto(java.lang.String)'在null对象引用" .. ..我想因为他没有看到片段视图,我该如何解决这个问题呢? 谢谢你的回答。 (我也有其他类的问题)
编辑:
AsyncTask不在StanzeFragment
中答案 0 :(得分:2)
Fragments
应该由系统实例化(因为它们在布局XML中定义)或者使用FragmentManager方法从代码实例化。
如果您只是实例化StanzeFragment
,那么它实际上并不会显示在视图堆栈上,而testo
TextView
是null
。 这似乎是你的问题。
在您的情况下,当Fragment
运行时AsyncTask
显然已经可见,您应该只获得对该Fragment
实例的引用,而不是创建一个新实例。
FragmentManager
有方法可以通过Fragment
(在XML中定义)或id
(以编程方式显示)时找到tag
:
修改强>
在Activity
的布局XML中,您可能有Fragment
:
<fragment
android:name="com.example.MyFragment"
android:id="@+id/my_fragment"
... />
现在,根据应用的确切配置(实际为Activity
类型),您可以调用:
...或...
...所以,例如:
FragmentManager fm = getFragmentManager();
访问FragmentManager
。然后,您会找到MyFragment
,其ID为my_fragment
:
MyFragment myFrag = (MyFragment)fm.findFragmentById(R.id.my_fragment);
这应该都在包含所述Activity
的{{1}}中完成。
保持对片段的引用的另一种(替代)方法是在Fragment
中实现onAttachFragment()
方法。 (在Activity
中将包含所述Activity
):
Fragment
系统构建并显示@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof StanzeFragment) {
stanzeFragment = (StanzeFragment) fragment;
}
}
时运行onAttachFragment()
方法。 documentation中的确切措辞是
立即将片段附加到此活动时调用 之后调用Fragment.onAttach()方法 Fragment.onCreate()。
所以此时Fragment
还没有完全准备就绪,但无论如何都会获得对实际出现在设备屏幕上的正确Fragment
实例的引用。因此,当您稍后在代码中使用Fragment
时,您可以访问其TextView和诸如此类的东西。
答案 1 :(得分:0)
如果您在StanzeFragment中执行AsyncTask,则只需执行以下操作:
@Override
protected void onPostExecute(String result) {
setTesto(result);
}