Android 异步任务类完成后,如何更改textview的值(在片段中)?

Android 异步任务类完成后,如何更改textview的值(在片段中)?,android,android-fragments,android-intent,android-asynctask,Android,Android Fragments,Android Intent,Android Asynctask,我是Android编程的初学者,这是我迄今为止最大的项目。请尝试在你的回答中非常具体,因为所有这些对我来说都是非常新的。 我想做的是在我的文本视图中用OneFragment显示天气(描述)的值` 这里是主要活动 package com.example.dell.myop; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; imp

我是Android编程的初学者,这是我迄今为止最大的项目。请尝试在你的回答中非常具体,因为所有这些对我来说都是非常新的。 我想做的是在我的文本视图中用OneFragment显示天气(描述)的值`

这里是主要活动

package com.example.dell.myop;

import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import com.example.dell.myop.R;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


import com.example.dell.myop.fragments.OneFragment;

import com.example.dell.myop.fragments.ThreeFragment;
import com.example.dell.myop.fragments.TwoFragment;

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    String description;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DownloadTask task = new DownloadTask();
        task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), "Today");
        adapter.addFragment(new TwoFragment(), "Tomorrow");
        adapter.addFragment(new ThreeFragment(), "Day After");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

我建议你将下载任务的逻辑移到你的框架中,如果你只在这一个框架中使用它的话。 这将非常容易,因此,只需获得描述和设置:

textView.setText(description); in your fragment,
如果您想在活动的其他组件上使用此downloadTask,您必须在活动上实现一些回调,并在任何片段上使用它们来更新UI。 因此,让我们假设您在活动中声明了一些接口

 interface OnDownloadTaskFinish {
 onFinish(String description);
 }
用在

 onPostExecute(...){
 //...some logic here 
 getFragment..... .onFinish(description);
} 
在您的片段中,您应该实现这个接口和

 void onFinish(String description){
 textView.setText(description);
 }
1) 在您的
下载任务
中创建一个
接口
,它的
设置器
通知代码
如下

private Listener listener;

public void setListener(Listener listener){
    this.listener = listener;
}

public interface Listener{
    onCompleted(String description);
}

@Override
protected void onPostExecute(String result) {
    // Your Current Code

    if(listener != null) listener.onCompleted(description);
}
private OneFragment oneFragment = new OneFragment();
2) 在您的
OneFragment

public class OneFragment extends Fragment implements DownloadTask.Listener{

     private TextView textView;

     @Override
     onCompleted(String description){
         if(description != null && textView !=null)
             textView.setDescription(description);
     }

     // Other code
}
3) 在
MainActivity
as中为
DownloadTask
创建
global reference
OneFragment
并将其设置为
Listener

private Listener listener;

public void setListener(Listener listener){
    this.listener = listener;
}

public interface Listener{
    onCompleted(String description);
}

@Override
protected void onPostExecute(String result) {
    // Your Current Code

    if(listener != null) listener.onCompleted(description);
}
private OneFragment oneFragment = new OneFragment();
4) 替换
adapter.addFragment(新的OneFragment(),“今天”)
by
adapter.addFragment(oneFragment,“今天”)

5) 将侦听器设置为

DownloadTask task = new DownloadTask();
task.setListener(oneFragment);
task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");

6) 最好在
viewPager.setAdapter(适配器)之后
执行
DowloadTask

以下两个答案基本上都遵循此答案