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キャッチ構文を使用して、タグ名にエラーがあるか、クエリにエラーがあるかを確認しましたが、いずれも問題ではありませんでした。
なぜ一つの断片でインターフェイスを作成し、他でそれを実装していませんか? – BiGGZ
また、2番目のフラグメントを実装する必要がありますか? しかし、TabLayoutでViewPagerをどのように移動しますか? –
まだ、両方のfragmntsが同じアクティビティにあるので、なぜあなたのメソッドを代わりに置かないのですか? – BiGGZ