2016-11-27 1 views
0

Android에서 하나의 MainActivity와 두 개의 조각으로 TabLayout을 만들었습니다.다른 조각 함수를 호출하는 방법

그러나 어떻게 두 번째 Fragment를 가져 와서 단추 이벤트를 받고 첫 번째 Fragment 함수를 호출합니까?

다음을 시도했지만 작동하지 않으며 묻습니다.

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 함수를 통해 Fragment 함수를 호출하려고하면 NullPointerException 오류가 발생합니다.

try catch 구문을 사용하여 태그 이름에 오류가 있거나 쿼리에서 오류가 발생했는지는 알 수 없지만 어느 것도 문제가되지 않았습니다.

+0

왜 한 조각에 인터페이스를 생성하고 다른 그것을 구현하지? – BiGGZ

+0

또한 두 번째 조각을 구현해야합니까? 그러나 TabLayout에서 ViewPager를 어떻게 이동합니까? –

+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

나는 따르지 않는다 ... 그래서 당신의 코드는 지금 일하고 있는가? – BiGGZ

+0

여전히 NullPointerException 오류가 발생했습니다 .. –

관련 문제