Фрагментирует синтаксический анализ данных в FragmentActivity TabListener

#android #interface #tabs #fragment #android-fragmentactivity

#Android #интерфейс #вкладки #фрагмент #android-fragmentactivity

Вопрос:

у меня есть несколько фрагментов в виде вкладок, и я создал класс интерфейса для синтаксического анализа строки из фрагмента в другой фрагмент в том же действии фрагмента. но проблема в том, что у меня принудительно закрывается телефон и вкладка, когда я начинаю переключать вкладки. Это лучший способ связи между фрагментами и помощь в решении проблемы. Спасибо….

Вот класс интерфейса

 public interface FragmentCommunicater {
    public void getData(String data);
}
  

Класс FragmentActivity

 public class Welcome extends FragmentActivity implements TabListener,FragmentCommunicater{

    private ActionBar actionbar;
    private ViewPager viewPager;


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

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        viewPager.setAdapter(new fragAdapter(getSupportFragmentManager()));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener(){

            @Override
            public void onPageSelected(int arg0) {
                actionbar.setSelectedNavigationItem(arg0);
            }
        });

        actionbar = getActionBar();
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.Tab dashboard_tab = actionbar.newTab();
        dashboard_tab.setText("Home");
        dashboard_tab.setTabListener(this);
        actionbar.addTab(dashboard_tab);

        ActionBar.Tab addPatient_tab = actionbar.newTab();
        addPatient_tab.setText("Add Patient");
        addPatient_tab.setTabListener(this);
        actionbar.addTab(addPatient_tab);
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void getData(String data) {
        FragmentManager fm = getSupportFragmentManager();
        ViewPatient vpFrag = (ViewPatient) fm.findFragmentById(R.id.view_patient_fragment);
        vpFrag.setData(data);
    }   
}

class fragAdapter extends FragmentPagerAdapter{

    public fragAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int arg0) {
        Fragment fragment = null;

        if(arg0 == 0){
            fragment = new Dashboard();
        }
        if(arg0 == 1){
            fragment = new AddPatient();
        }       
        return fragment;
    }

    @Override
    public int getCount() {
        return 5;
    }
}
  

Отправка фрагмента

 public class Dashboard extends Fragment {

    private Button btn_searchPatient;   
    private FragmentCommunicater fragComm;

    public Dashboard() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_dashboard, container, false);            btn_searchPatient = (Button) view.findViewById(R.id.btn_searchPatient);     

        fragComm = (FragmentCommunicater) getActivity();        
        initializeActions();

        return view;
    }

    private void initializeActions(){

        btn_searchPatient.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {

                if(!result.isEmpty()){
                    fragComm.getData("test parse string"));
                }
            }
        });     
    }
}
  

Получение фрагмента

 public class ViewPatientextends Fragment {

    public ViewPatient() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_view_patient, container, false); 
        return view;
    }

    public void setData(String data){
        Toast.makeText(getActivity().getApplicationContext(), data, Toast.LENGTH_LONG).show();
    }
}
  

Ответ №1:

В функции getData в FragmentActivity необходимо изменить следующим образом ,

 @Override
public void getData(String data) {
    FragmentManager fm = getSupportFragmentManager();
    ViewPatient vpFrag = (ViewPatient) fm.findFragmentByTag(R.id.view_patient_fragment);
    vpFrag.setData(data);
}
  

findFragmentById необходимо изменить на findFragmentByTag и передать тег фрагмента при его создании, например,

 @Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    ((Welcome)getActivity()).setViewPatientFragmentTagData(getTag());
}
  

путем реализации метода во FragmentActivity с именем setViewPatientFragmentTagData, например,

 public void setViewPatientFragmentTag(String tag){
    viewPatientFragmentTag = tag;
}
  

со строковой переменной viewPatientFragmentTag. Этот метод работает хорошо.