如何更新所有片段? onProgressUpdate 不更新所有片段
Posted
技术标签:
【中文标题】如何更新所有片段? onProgressUpdate 不更新所有片段【英文标题】:How to Update all fragments? onProgressUpdate Does not update all fragments 【发布时间】:2016-12-20 21:32:31 【问题描述】:我基本上是在AsyncTask
中更新了一个值,我使用onPostExecute
将它发送到片段。
所有片段都应在TextView
上显示相同的值。
我的问题是我的应用程序有 3 个片段页面,只有中间页面 (Fragment_B) 正在更新...
(如果我将 Fragment_B 更改为 Fragment_A (在下面的代码行中),则只有 Fragment_A 会更新)。
public Fragment getItem(int position)
switch (position)
case 0:
return new Fragmento_B();
case 1:
return new Fragmento_A(); //now only Fragment_A updates
case 2:
return new Fragmento_C();
default:
return null;
为什么所有片段不同时更新?该值永远不会显示在 Fragment_A 和 Fragment_C 上。
OnPostUpdate
应该更新所有片段,但它只更新 Fragment_B。但我试图调试这个问题,我创建了一个onPreUpdate
和我的 SetText,它适用于每个片段。我不知道为什么会这样。有人可以帮帮我吗?
public class Cliente extends AsyncTask<Void, Void, Void>
String dstAddress;
int dstPort;
String[] valores = new String[2];
TextView textResponse,textResponse2;
public Cliente(String addr, int port, TextView textResponse)
dstAddress = addr;
dstPort = port;
this.textResponse = textResponse;
// this.textResponse2 = textResponse2;
public Cliente(TextView textResponse)
this.textResponse = textResponse;
@Override
protected void onPreExecute()
super.onPreExecute();
textResponse.setText("HELLO");
@Override
protected Void doInBackground(Void... arg0)
Socket socket = null;
try
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
1024);
byte[] buffer = new byte[1024];
int bytesRead;
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
/*
* notice: inputStream.read() will block if no data return
*/
valores[0] = r.nextLine();
catch (UnknownHostException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
if (socket != null)
try
socket.close();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return null;
@Override
protected void onPostExecute(Void result)
super.onPostExecute(result);
textResponse.setText(":D");
片段 A:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View v = inflater.inflate(R.layout.activity_second,container,false);
x_atual = (TextView) v.findViewById(R.id.x_atual);
y_atual = (TextView) v.findViewById(R.id.y_atual);
x_desejado = (TextView) v.findViewById(R.id.x_desej);
y_desejado = (TextView) v.findViewById(R.id.y_desej);
ola = (TextView) v.findViewById(R.id.textView12);
new Cliente("192.168.2.5",6000,ola).execute();
return v;
片段 B:
public class Fragmento_B extends android.support.v4.app.Fragment
public TextView x_atual,y_atual,x_desejado,y_desejado,ola2,ola;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View v = inflater.inflate(R.layout.activity_third,container,false);
ola2 = (TextView) v.findViewById(R.id.textView2);
new Cliente("192.168.2.5",6000,ola2).execute();
return v;
基本上,onPostUpdate 只会让“:D”出现在 fragment_B 上,而 onPreUpdate 效果很好,并且在两者上都出现“Hello”。
片段适配器活动
public class Main2Activity extends FragmentActivity
private TabLayout mTabLayout;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mViewPager.setAdapter(new FragmentoAdapter(getSupportFragmentManager(),getResources().getStringArray(R.array.tiles_tab)));
mTabLayout.setupWithViewPager(mViewPager);
片段适配器类
public class FragmentoAdapter extends FragmentPagerAdapter
private String[] mTabTiles;
public FragmentoAdapter(FragmentManager fm,String[] mTabTiles)
super(fm);
this.mTabTiles = mTabTiles;
@Override
public Fragment getItem(int position)
switch (position)
case 0:
return new Fragmento_A();
case 1:
return new Fragmento_B();
case 2:
return new Fragmento_C();
default:
return null;
@Override
public int getCount()
return this.mTabTiles.length;
@Override
public int getItemPosition(Object object)
return POSITION_NONE;
@Override
public CharSequence getPageTitle(int position)
return this.mTabTiles[position];
MY APPLICATION
【问题讨论】:
【参考方案1】:为什么要在单独的片段中制作相同的逻辑?
您应该创建DataManager
来获取和存储数据(阅读有关 MVP/MVC 模式的更多信息)。此外,您不应将视图作为 arg 传递。如果你想使用 Asynctask 在 Activity 中使用它作为内部类,然后获取这个 TextView
字段并在 onPostExecute()
中设置它
【讨论】:
你能把它简单一点吗?我刚开始在android中编程。这不是一个简单的问题吗?为什么它只更新第二个片段? 否则我认为使用按钮更改活动会更容易。虽然这样会更漂亮。 @TiagoSilva 你调试了吗?以上是关于如何更新所有片段? onProgressUpdate 不更新所有片段的主要内容,如果未能解决你的问题,请参考以下文章
如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)