Не получить значение в фрагменте от деятельности - PullRequest
0 голосов
/ 28 января 2019

Я хочу передать данные в активность во фрагмент с использованием ссылки на активность:

код, как показано ниже: В MainActiivty

public Integer i = 0; 

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 thread = new Thread() {
            @Override
            public void run() {
                try {
                    while (!thread.isInterrupted()) {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                i++;
                            }
                        });
                    }
                } catch (InterruptedException e) {
                }
            }
        };
        thread.start();
}

Во фрагменте:

MainActivity ma=new MainActivity();
mySpeed = String.valueOf(ma.i);

Проблема в том, что значение i остается 0, я не могу получить обновленное значение i

, если я сохраню i в другой переменной Globe (j) и во фрагменте

  MainActivity ma=new MainActivity();
   mySpeed = String.valueOf(ma.j);

, тогда яполучил ошибку

java.lang.NumberFormatException: For input string: "null"
        at java.lang.Integer.parseInt(Integer.java:521)
        at java.lang.Integer.valueOf(Integer.java:611)

весь код фрагмента

 public class SpeedFragment extends Fragment {

        View view;
        TextView SpeedFrgvalue;
        DigitSpeedView DigitrpmFrgView;
        SpeedView speedometer;

        Button DigitalView,Gaugeview;
        LinearLayout linearLayoutspeed;

        String mySpeed;

        private int myInteger;

        Thread thread;

        public SpeedFragment() {
            // Required empty public constructor
        }

        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Bundle bundle = this.getArguments();
            mySpeed = bundle.getString("speed");
                  Toast.makeText(getContext(),mySpeed,Toast.LENGTH_SHORT).show();

        }

        public void setMyInteger(int i) {
            this.myInteger = i;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            // Inflate the layout for this fragment
            view=inflater.inflate(R.layout.fragment_speed, container, false);
            SpeedFrgvalue=(TextView)view.findViewById(R.id.speedfrgvalue);
            speedometer=(SpeedView)view.findViewById(R.id.speedViewfrag);
            Gaugeview=(Button)view.findViewById(R.id.Gaugeviewid);
            DigitalView=(Button)view.findViewById(R.id.digitalviewid);


            SpeedFrgvalue.setText(String.valueOf(myInteger));
            linearLayoutspeed=(LinearLayout)view.findViewById(R.id.digitalspeedlinaear);
            DigitrpmFrgView=(DigitSpeedView)view.findViewById(R.id.digitalSpeedfrgid);
            DigitrpmFrgView.updateSpeed((myInteger));


            speedometer.setMaxSpeed(250);
    //        speedometer.speedTo(Integer.valueOf(mySpeed),4000);

            return view;

        }
    }

Внутри создания MainActiivty Я вызываю setMyInteger;То же, что упоминание Юсафа.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы должны отправить свои данные в связке, а затем вам нужно получить эти данные из вашего фрагмента.

Bundle bundle = new Bundle();
bundle.putString("key", "value");
// make object of your fragment and set arguments to pass
Fragmentclass object = new Fragmentclass();
object.setArguments(bundle);

Затем в вашем классе фрагментов

 String text = getArguments().getString("key");

И вы будетеполучить значение в тексте от этого.

0 голосов
/ 29 января 2019

Первое, что я должен позаботиться о том, чтобы при создании фрагмента мы могли получить ошибку нулевого указателя.Таким образом, я прикрепил фрагмент внутри activity_main в onCreate в MainActivity.

FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Frag1 fragment = new Frag1();
    fragmentTransaction.replace(R.id.ll, fragment);
    fragmentTransaction.commit();

Далее я запускаю поток после этого, используя метод нажатия кнопки.

public void run(View view){
    t = new Thread(this, "Demo Thread");
    System.out.println("Child thread: " + t);
    t.start(); // Start the thread
}

Если я включу три вышеупомянутых строкивнутри onCreate после транзакции фрагмента я получаю ошибку нулевого указателя.Далее следует сложная часть: поток будет генерировать новые значения с течением времени, но остальная часть кода уже запущена.Вот почему вы получаете ноль (начальное значение).Это может быть решено технически (насколько мне известно) либо путем создания намерения, либо путем создания прослушивателя.Я пытался использовать Intent, к сожалению, пока Intent переходит от Fragment к MainActivity (или к любому другому действию), я не мог сделать это от Activity к фрагменту (возможно, что-то по-прежнему отсутствует).Поэтому я использовал Listener.Теперь нет готового слушателя, мы должны его создать.Более хитроумно, как это использовать.Я создал для этого интерфейс OnFragmentInteractionListener.java.

interface OnFragmentInteractionListener {
    void onFragmentInteraction(int i);}

Теперь внутри Fragment я хочу отобразить это в TextView.Для этого я бы создал представления внутри метода onStart () (в противном случае я получаю ошибку нулевого указателя :-).И я создам интерфейс внутри него.

Activity context;
TextView tv;
static OnFragmentInteractionListener onFragmentInteractionListener;
@Override
public void onStart() {
    super.onStart();
    context = getActivity();
    tv = context.findViewById(R.id.output)   ;
    onFragmentInteractionListener = new OnFragmentInteractionListener() {
        @Override
        public void onFragmentInteraction(int i) {
        tv.setText(" OUT "+i);
        }
    };
}

Далее вернемся к MainActivity.

@Override
public void run() {
    try {
        for(int i = 20; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            Frag1.onFragmentInteractionListener.onFragmentInteraction(i);
            Thread.sleep(2000);
        }
    } catch (InterruptedException e) {
        System.out.println("Child interrupted.");
    }
    System.out.println("Exiting child thread.");
}

Если вы запустите код, вы получите вывод, как вы хотели.

0 голосов
/ 28 января 2019
MainActivity ma=new MainActivity();

Вы не должны создавать экземпляры своих действий таким образом.

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

Один из способов достижения этого заключается в следующем:

  • Определение целочисленной переменной-члена во фрагменте

    private int myInteger;
    
  • Определениеметод открытого сеттера для этой целочисленной переменной во фрагменте

    public void setMyInteger(int i) {
       this.myInteger = i;
    }
    
  • Внутренняя деятельность, создание экземпляра этого фрагмента и установка значения целочисленной переменной во фрагменте с помощью метода сеттера

    MyFragment frag = new MyFragment();
    frag.setMyInteger(10);
    

Существуют и другие способы достижения этой цели, см. Отправка данных из активности во фрагмент в Android

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