#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. Этот метод работает хорошо.