Как я могу обновить фрагмент, используя FragmentManager? - PullRequest
0 голосов
/ 13 июня 2019

Я сделал несколько простых фрагментов и знаю, что хочу обновить контент из другой ветки. Но я не знаю как. Если бы я использовал простые фрагменты, я мог бы использовать интерфейс, но в моем случае это не работает, я думаю.

Я попытался использовать 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 ]

1 голос
/ 14 июня 2019

По сути, дело в том, что updateData() метод cf_Fragment_MainDriver1 может быть вызван из любого потока, который вы хотите, но если вы хотите обновить пользовательский интерфейс этого Fragment, вы должны сделать вызов из потока основного пользовательского интерфейса.

В вашем случае вы уже вне пользовательского интерфейса поток с именем c_Thread_Update_Fragent и затем вы можете вызвать из него метод updateData() ( который в случае обновляет ваш интерфейс) . Итак, для этого вы должны быть в Main / UI thread .

Таким образом, простое решение состоит в том, что у вас уже есть экземпляр Fragment объекта fi , который может предоставить вам доступ к основному потоку, используя его Контекст действия , из которого вы можно использовать метод runOnUiThread () , который принимает Runnable в качестве аргумента, поэтому код ниже работает:

fi.getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Now you can make calls to fragment here like:
        args.putInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1, i);
        fi.setArguments(args);
    }
});
0 голосов
/ 13 июня 2019

Я бы предложил использовать библиотеку Event Bus.Это хороший способ общения между различными потоками.Просто отправьте событие и подпишитесь на событие

https://github.com/greenrobot/EventBus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...