2016-08-14 4 views
1

私は基本的に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]; 
    } 
} 

MY APPLICATION

答えて

0

なぜあなたは別のフラグメントで同じロジックを作っていますか? データを取得して保存するDataManagerを作成する必要があります(MVP/MVCパターンの詳細を参照)。また、argとしてビューを渡すべきではありません。 Asynctaskを使用する場合は、Activityで内部クラスとして使用してからTextViewフィールドを取得し、これをonPostExecute()

+0

に設定してください。少し簡単にできますか?私はちょうどアンドロイドでプログラムを始めました。これは単純な問題ではありませんか?なぜそれは2番目のフラグメントだけを更新するのですか? –

+0

そうでなければ、ボタンを使ってアクティビティを変更する方が簡単になると思います。これははるかにきれいですが。 –

+0

@TiagoSilvaデバッグしましたか? –

関連する問題