2016-11-27 7 views
0

Androidで1つのMainActivityと2つのフラグメントでTabLayoutを作成しました。他のフラグメントファンクションを呼び出す方法

しかし、ボタンイベントを受け取り、最初のFragment関数を呼び出すために、2番目の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"); 
    } 
} 

第2のフラグメントコード

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キャッチ構文を使用して、タグ名にエラーがあるか、クエリにエラーがあるかを確認しましたが、いずれも問題ではありませんでした。

+0

なぜ一つの断片でインターフェイスを作成し、他でそれを実装していませんか? – BiGGZ

+0

また、2番目のフラグメントを実装する必要がありますか? しかし、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エラー.. –

関連する問題