私は基本的にAsyncTask
の内部で更新された値を取得しており、それをフラグメントに送信するのにonPostExecute
を使用します。 すべてのフラグメントはTextView
に同じ値を表示する必要があります。すべてのフラグメントを更新するには? onProgressUpdateすべてのフラグメントを更新しません
私の問題は、私は以下のコード)の行に(Fragment_A にFragment_Bを変更する場合は、私のアプリケーションでのみ、(3フラグメントページとだけ中位ページ(Fragment_B)が更新され...
を持っているということです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:うまく機能し、両方に "こんにちは" と表示されます: "D" fragment_BとonPreUpdateに表示されます
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のみになり。
FRAGMENTADAPTER活動
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);
}
FRAGMENTADAPTERのCLASS
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];
}
}
に設定してください。少し簡単にできますか?私はちょうどアンドロイドでプログラムを始めました。これは単純な問題ではありませんか?なぜそれは2番目のフラグメントだけを更新するのですか? –
そうでなければ、ボタンを使ってアクティビティを変更する方が簡単になると思います。これははるかにきれいですが。 –
@TiagoSilvaデバッグしましたか? –