2016-03-22 3 views
0

Я хочу обновить фрагмент, когда пейджер представления изменится на него.Обновить фрагмент, когда другой фрагмент изменяет модель фрагмента первого порядка

package com.mcivisoft.rcbeam; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.mcivisoft.rcbeam.R; 

public class FragBeamRec extends Fragment {  
    public static FragBeamRec newInstance() { 
     FragBeamRec fragment = new FragBeamRec(); 
     return fragment; 
    } 

    public FragBeamRec() {} 

    private EditText tasss = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View v = inflater.inflate(R.layout.fragment_frag_beam_rec, container, false); 

     tasss = (EditText)v.findViewById(R.id.txttttaasss); 
     tasss.setText(String.valueOf(var.asspass)); 

     ActivityBeamRec.mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if (position == 2) { 
        Fragment frg = null; 
        frg = getFragmentManager().findFragmentByTag("FragBeamRec"); 
        final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        ft.detach(frg); 
        ft.attach(frg); 
        ft.commit(); 
       } 
      } 

      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

      @Override 
      public void onPageScrollStateChanged(int state) {} 
     }); 

     return v; 
    } 
} 

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

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

+1

Pls показывает ваш код для события нажатия кнопки. – Prudhvi

+0

Зачем вам обновлять фрагмент. это не имеет никакого смысла. если вы хотите передать значение ur для активности или другого фрагмента, создайте пользовательские интерфейсы прослушивателя. – uguboz

+0

значение находится в глобальной переменной, поэтому любая активность или фрагмент могут получить к ней доступ, но проблема в том, что я не могу помещать ее в текст редактирования в другом фрагменте –

ответ

1

Вместо обновления фрагмента необходимо просто обновить представление. См. Руководство по общению между фрагментами (http://developer.android.com/training/basics/fragments/communicating.html) для учебника. Здесь применяются те же самые понятия.

В основном вы хотите сообщить FragBeamRec фрагмент, что расчет является полным внутри кнопки он OnClickListener как этот

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int result = 4 + 4; 
      fragBeamRec.onCalculationComplete(result); 
     } 
    }); 

с интерфейсом

public interface OnCalcComplete {  
    void onCalculationComplete(int result); 
} 

Тогда в фрагменте есть что-то вроде

public class FragBeamRec extends Fragment implements OnCalcComplete { 
    public void onCalculationComplete(int result) { 
     textView.setText(result); 
    } 
... 
} 
+0

, как я могу обновить представление? –

+0

Не нужно, если это «TextView». Он будет автоматически обновляться при вызове 'setText'. Извините, если мой ответ подразумевал иначе –

+0

Я нашел способ сделать это, см. Мой ответ, это правильно? –

0

I сделал это, заменив private EditText tasss = null; на public static EditText tasss = null; таким образом я могу получить доступ к его из anywhere.and на кнопку на мыши слушателю FragBeamRec.tasss.setText(String.valueOf(var.asspass));

+0

Этот код очень опасен по тонким причинам. Статическое поле является общим для всех экземпляров класса и не является потокобезопасным. Вероятно, вы столкнетесь с проблемами, когда ваше приложение связано с фоном или даже при повороте экрана. Также как вы знаете, когда вызывать 'setText'? –

0

Я думаю, что вся ваша реализация сомнительна

Вы FragBeamRec внутри ViewPager, который находится внутри ActivityBeamRec.

Идти, если у вас есть 4 фрагмента внутри вашего ViewPager, скорее всего, FragBeamRec даже не был создан, когда происходят изменения в указанной модели данных.

Лучшая реализация - это огонь, все обновленные из ActivityBeamRec. Зарегистрируйте viewPagerChangeListener внутри действия. Вы также можете связать интерфейс Listener, который активируется при активности ActivityBeamRec при изменении модели.

Теперь вы можете получить фрагмент из деятельности с использованием

private Fragment getFragmentFromPager(int index) { 
    return getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.parentViewPager + ":" + index); 
} 

Пропустив в позиции индекса фрагмента внутри ViewPager, вы получите объект Fragment, с которым вы можете выходной сигнал переноса в любой форме обновления

Смежные вопросы