2016-11-27 2 views
0

Я создал TabLayout с одним MainActivity и двумя фрагментами в Android.Как вызвать функцию фрагмента фрагмента

Но как вы получаете второй фрагмент, чтобы получить событие кнопки и вызвать первую функцию Фрагмента?

Я пробовал следующее, но это не работает, и я спрашиваю.

public interface CustomSearchPOI { 
    void requestSearch(String query); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     customSearchPOI = (CustomSearchPOI)context; 
    } catch (ClassCastException ex) { 
     throw new ClassCastException(context.toString() + "must implement CustomSearchPOI"); 
    } 
} 

Второй фрагмент кода

if(info_cursor != null) { 
     info_cursor.moveToFirst(); 
     while(!info_cursor.isAfterLast()) { 
      if(info_cursor.getInt(0) == id) { 
       out_subject.setText(info_cursor.getString(1)); 
       out_college.setText(info_cursor.getString(2)); 
       out_classroom.setText(info_cursor.getString(3)); 
       break; 
      } 
      info_cursor.moveToNext(); 
     } 
    } 
    choice_dialog.setPositiveButton(getString(R.string.Location_navigate), new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      TabsFragment.viewPager.setCurrentItem(0); 
      customSearchPOI.requestSearch(out_college.getText().toString()); 
     } 
    }); 
    choice_dialog.setNegativeButton(getString(R.string.tt_modify), new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      update_timetable_dialog(id); 
     } 
    }); 
    choice_dialog.show(); 

Вызов функции Код

@Override 
public void requestSearch(String query) { 
    String FRAGMENT_TAG = "LOCATION_TAG"; 
    Fragment fragment = new MapFragment(); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(fragment, FRAGMENT_TAG).commitAllowingStateLoss(); 
    try { 
     ((MapFragment)getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG)).searchPOI(query); 
    } catch(NullPointerException ex) { 
     ex.printStackTrace(); 
     Log.d("[TAG]", fragment.getTag()); 
    } 
} 

MainActivity Код

public void searchPOI(String query) { 
    query = Searchcheck(query); 
    TMapData data = new TMapData(); 
    if(!TextUtils.isEmpty(query)) { 
     data.findAllPOI(query, new TMapData.FindAllPOIListenerCallback() { 
      @Override 
      public void onFindAllPOI(final ArrayList<TMapPOIItem> arrayList) { 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         tMapView.removeAllMarkerItem(); 
         for (TMapPOIItem poi : arrayList) { 
          addMarker(poi); 
         } 
         if(arrayList.size() > 0) { 
          TMapPOIItem poi = arrayList.get(0); 
          moveMap(poi.getPOIPoint().getLatitude(), poi.getPOIPoint().getLongitude()); 
          if(poi.getPOIPoint().getLatitude() > 36.832311 && poi.getPOIPoint().getLongitude() < 127.165038) { 
           Snackbar.make(coordinatorLayout, getString(R.string.No_place), Snackbar.LENGTH_LONG).show(); 
           if(location_me.getVisibility() != View.INVISIBLE) { 
            location_me.hide(); 
           } 
           return; 
          } 
          dst = new TMapPoint(poi.getPOIPoint().getLatitude(), poi.getPOIPoint().getLongitude()); 
          searchRoute(src, dst); 
         } 
        } 
       }); 
      } 
     }); 
    } 
} 

Первый фрагмент кода (функция для вызова)

Согласно документации по разработке Google, прямая связь между фрагментами и фрагментами невозможна.

Поэтому, когда я пытаюсь вызвать функцию фрагмента из Fragment через Activity, я получаю ошибку NullPointerException.

Я использовал синтаксис try catch, чтобы увидеть, была ли ошибка в имени тега или ошибке в запросе, но ни одна из них не была проблемой.

+0

почему бы не создать интерфейс в одном фрагменте и реализовать его в другом? – BiGGZ

+0

Вам также нужно реализовать второй фрагмент? Но как вы перемещаете ViewPager в TabLayout? –

+0

еще лучше, так как оба fragmnts находятся в одной и той же деятельности, почему бы вам не поставить вместо этого свой метод? – BiGGZ

ответ

1

FragmentX:

public class MyFragment extends Fragment{ 

    interface MyInterface{ 

     void doSomething(); 
    } 

    public void someMethodInYourFragment(){ 
    ((MyInterface)getContext()).doSomething();//throws ClassCastException if not implemented in Activity 
    } 

} 

Класс X:

public class MyActivity extends Activity implements MyFragment.MyInterface{ 

    @Override 
    public void doSomething(){ 
    //do stuff here 
    } 
} 
+0

исправленный код в разделе вопросов. Это правильный код? Если вы это сделаете, вы получите ошибку NullPointerException. –

+0

i dont follow ... так что ваш код работает сейчас? – BiGGZ

+0

Все еще ошибка NullPointerException .. –

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