如何使用FragmentManager更新片段?

时间:2019-06-13 11:37:45

标签: android android-fragments

我做了一些简单的片段,并且知道我想从另一个线程更新内容。但是我不知道如何。 如果我要使用简单的Fragments,我可以使用接口,但就我而言,这是行不通的。

我尝试使用Bundle并在Sequene中对其进行更新,但这只能使用一次,因为我不知道如何两次调用该方法。

片段


import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;


public class cf_Fragment_MainDriver1 extends Fragment {
    public static final String ARGS_MainDriver1 = "ARGS_MainDriver1";
    public static final String ARGS1_MainDriver1 = "ARGS1_MainDriver1";
    c_Thread_Update_Fragent c_thread_update_fragent = new c_Thread_Update_Fragent();
    private TextView tv_MainDriver1_counter;



    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_cf_fragment_main_driver1, container, false);
        Bundle args = getArguments();
        String arg1 = Integer.toString(args.getInt(cf_Fragment_MainDriver1.ARGS_MainDriver1));
        ((TextView) root.findViewById(R.id.tv_MainDriver1)).setText(arg1);
        tv_MainDriver1_counter = root.findViewById(R.id.tv_MainDriver1_counter);
        updateData();
        return root;
    }

    public void updateData(){
        String x;
        Bundle args = getArguments();
        x = Integer.toString(args.getInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1));
        tv_MainDriver1_counter.setText(x);
    }

}

线程

package com.example.fragmentmanagermain;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;

import static android.content.ContentValues.TAG;

public class c_Thread_Update_Fragent extends Thread {
    private static Fragment fi;
    private Bundle args;

    @Override
    public void run() {

        int i=0;

        while (true)
        {
            try {

                args.putInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1, i);
                fi.setArguments(args);
                Log.d(TAG, "run: Works");

            }catch (NullPointerException e){
                Log.d(TAG, "run: Failed");
            }


            i++;
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void getFragment(Fragment f){
        fi =f;
    }
}

主要

package com.example.fragmentmanagermain;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    c_PagerAdapter_Driver1 c_pagerAdapter_driver1;
    c_PagerAdapter_Driver2 c_pagerAdapter_driver2;
    c_Thread_Update_Fragent c_thread_update_fragent = new c_Thread_Update_Fragent();


    ViewPager viewPager;
    Button bt_Driver1;
    Button bt_Driver2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt_Driver1 = findViewById(R.id.bt_Driver1);
        bt_Driver2 = findViewById(R.id.bt_Driver2);

        c_pagerAdapter_driver1 = new c_PagerAdapter_Driver1(getSupportFragmentManager());
        c_pagerAdapter_driver2 = new c_PagerAdapter_Driver2(getSupportFragmentManager());

        viewPager = findViewById(R.id.MainPager);
        viewPager.setAdapter(c_pagerAdapter_driver1);

        c_thread_update_fragent.start();


        bt_Driver1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setFragment_Driver1();
            }
        });

        bt_Driver2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setFragment_Driver2();
            }
        });
    }

    private void setFragment_Driver1() {
        viewPager.setAdapter(c_pagerAdapter_driver1);
    }

    private void setFragment_Driver2() {
        viewPager.setAdapter(c_pagerAdapter_driver2);

    }

}

所以在这种情况下,我的问题是,如何使用第二线程的公共方法updateData()?

2 个答案:

答案 0 :(得分:1)

基本上,可以从任何所需的线程中调用updateData()的{​​{1}}方法,但是如果要更新该cf_Fragment_MainDriver1的UI,则必须从主UI线程。

在您的情况下,您已经是名为 Fragment UI 线程,然后可以调用c_Thread_Update_Fragent方法从中(以防更新您的用户界面)。因此,要执行此操作,您必须位于 Main / UI线程上。

因此,简单的解决方案是您已经拥有updateData()对象 fi 的实例,该实例可以使用其 Activity上下文来使您挂接到主线程>,您可以从中使用方法{strong> runOnUiThread() ,该方法以Fragment作为参数,这就是下面的代码起作用的原因:

Runnable

答案 1 :(得分:0)

i建议使用事件总线库。这是在不同线程之间进行通信的好方法。 只需发送事件并订阅事件

https://github.com/greenrobot/EventBus