为什么在AsyncTask中View Fragment为null?

时间:2016-09-18 17:11:58

标签: android android-fragments android-asynctask

这是我的片段类:

公共类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

2 个答案:

答案 0 :(得分:2)

Fragments应该由系统实例化(因为它们在布局XML中定义)或者使用FragmentManager方法从代码实例化。

如果您只是实例化StanzeFragment,那么它实际上并不会显示在视图堆栈上,而testo TextViewnull似乎是你的问题。

在您的情况下,当Fragment运行时AsyncTask显然已经可见,您应该只获得对该Fragment实例的引用,而不是创建一个新实例。

FragmentManager有方法可以通过Fragment(在XML中定义)或id(以编程方式显示)时找到tag

findFragmentById()

findFragmentByTag()

修改

Activity的布局XML中,您可能有Fragment

<fragment
    android:name="com.example.MyFragment"
        android:id="@+id/my_fragment"
    ... />

现在,根据应用的确切配置(实际为Activity类型),您可以调用:

getFragmentManager()

...或...

getSupportFragmentManager()

...所以,例如:

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);
}