当前位置: 首页 > 知识库问答 >
问题:

如何更新所有碎片?onProgressUpdate不更新所有片段

吕修筠
2023-03-14

我基本上是在AsyncTask中更新一个值,并使用onPostExecute将其发送到片段。所有片段都应该在textview上显示相同的值。

我的问题是我的应用程序有3个片段页面,只有中间的页面(Fragment_B)在更新...

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应该更新所有的片段,但它只更新片段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;
}
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;
}
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];
    }
}

我的申请

共有1个答案

陈阳舒
2023-03-14

你为什么在不同的片段中做同样的逻辑?您应该创建DataManager来获取和存储数据(阅读更多关于MVP/MVC模式的信息)。另外,您不应该将view作为arg传递。如果要使用Asynctask,请在Activity中使用它作为内部类,然后获取这个TextView字段,并在onPostExecute()中设置该字段

 类似资料:
  • 问题内容: 在使用Node.js环境的过程中,我遇到了Node.js模块的版本维护问题。我想确保所有内部Node.js模块都已更新。 现有的许多手册都只关注如何更新Node.js模块,而不关注如何 自动化 此类例程。 问题: 如何将所有Node.js模块自动更新到最新版本? 理想情况下,它应该是一些脚本,作业或任务。 问题答案: 要手动更新所有Node.js模块: 具有 管理 权限的打开控制台 转

  • 问题内容: 我有一个带有单个主键的表。当我尝试执行插入操作时,尝试插入具有现有键的行可能会导致冲突。我要允许插入更新所有列吗?有什么简单的语法吗?我试图让它“ upsert”所有列。 我正在使用PostgreSQL 9.5.5。 问题答案: 该语法 要求 显式命名目标列。避免这种情况的可能原因: 您有很多列,只是想缩短语法。 除了唯一列,您不 知道 列名。 必须以匹配顺序和匹配数据类型表示 “目标

  • 我有两个集合A和B,我在另一个集合B中有一个字段的引用,因此将两个结果聚合到: 集合A中的文件是:

  • 我痛苦了3天。我正在使用兼容性库中的视图分页程序。我已经成功地让它显示了几个视图。我的问题是,当我交换视图时,不会在它的回收器视图中按片段更新数据。但当我关闭应用程序时,打开碎片会按回收器视图显示更新内容。我使用了所有方法,如setnotifydatachanged()和许多其他方法,但viewpager中的片段不更新内容。感谢所有的帮助,这是我的主要活动

  • 问题内容: 在Firebase的数据库中,我需要更新open的值并将其传递给 所有子级的false。我如何用Java语言做到这一点?像这样 问题答案: Firebase数据库没有与SQL等效的数据库UPDATE messages SET open=false。 要更新Firebase中的节点,您必须首先具有对该特定节点的引用。为了获得对节点的引用,您必须知道该 节点的完整路径。 这意味着您首先需要