Android 异步任务类完成后,如何更改textview的值(在片段中)?
我是Android编程的初学者,这是我迄今为止最大的项目。请尝试在你的回答中非常具体,因为所有这些对我来说都是非常新的。 我想做的是在我的文本视图中用OneFragment显示天气(描述)的值` 这里是主要活动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
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(),“今天”)
byadapter.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
代码>以下两个答案基本上都遵循此答案