フラグメントからアクティビティのメソッドを呼び出そうとしています。フラグメントがメソッド データを提供し、メソッドが返されたときにデータを取得する必要があります。静的メソッドの呼び出しと同様のことを実現したいのですが、アクティビティに問題が発生するため、静的を使用しません。
フラグメントは初めてなので、簡単で教育的な説明が必要です!
ありがとう!
フラグメントからアクティビティのメソッドを呼び出そうとしています。フラグメントがメソッド データを提供し、メソッドが返されたときにデータを取得する必要があります。静的メソッドの呼び出しと同様のことを実現したいのですが、アクティビティに問題が発生するため、静的を使用しません。
フラグメントは初めてなので、簡単で教育的な説明が必要です!
ありがとう!
フラグメントからアクティビティへ:
((YourActivityClassName)getActivity()).yourPublicMethod();
アクティビティからフラグメントへ:
FragmentManager fm = getSupportFragmentManager();
//if you added fragment via layout xml
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();
コードでフラグメントをtag
追加し、フラグメントを追加したときに文字列を使用した場合は、findFragmentByTag
代わりに次を使用します。
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
フラグメントを別の場所で使用したい場合に備えて、フラグメントをアクティビティから分離するようにしてください。これを行うには、アクティビティが実装するインターフェイスを作成します。
したがって、次のようなインターフェイスを定義します。
たとえば、アクティビティに文字列を与え、整数を返すようにしたいとします。
public interface MyStringListener{
public Integer computeSomething(String myString);
}
これは、フラグメントまたは別のファイルで定義できます。
次に、アクティビティにインターフェースを実装させます。
public class MyActivity extends FragmentActivity implements MyStringListener{
@Override
public Integer computeSomething(String myString){
/** Do something with the string and return your Integer instead of 0 **/
return 0;
}
}
次に、フラグメントに MyStringListener 変数があり、リスナーをフラグメントの onAttach(Activity activity) メソッドに設定します。
public class MyFragment {
private MyStringListener listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (MyStringListener) context;
} catch (ClassCastException castException) {
/** The activity does not implement the listener. */
}
}
}
編集 (17.12.2015):onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended
最初の答えは間違いなく機能しますが、現在のフラグメントをホスト アクティビティと結び付けます。別のアクティビティでフラグメントを使用する場合に備えて、フラグメントをホスト アクティビティから切り離しておくことをお勧めします。
私はマルコの回答が完全に好きですが、パブリッシュ/サブスクライブベースのフレームワークを使用して同じ結果を達成することもできることを指摘するのは公正だと思います。たとえば、イベントバスを使用する場合、次のことができます
フラグメント:
EventBus.getDefault().post(new DoSomeActionEvent());
アクティビティ:
@Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something
}
これが私がこれをした方法です:
最初の作成インターフェース
interface NavigationInterface {
fun closeActivity()
}
次に、アクティビティがインターフェイスを実装し、インターフェイス メソッドをオーバーライドしていることを確認します。
class NotesActivity : AppCompatActivity(), NavigationInterface {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_notes)
setSupportActionBar(findViewById(R.id.toolbar))
}
override fun closeActivity() {
this.finish()
}
}
次に、必ずフラグメントでインターフェースリスナーを作成してください
private lateinit var navigationInterface: NavigationInterface
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//establish interface communication
activity?.let {
instantiateNavigationInterface(it)
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_notes_info, container, false)
}
private fun instantiateNavigationInterface(context: FragmentActivity) {
navigationInterface = context as NavigationInterface
}
次に、次のような呼び出しを行うことができます。
view.findViewById<Button>(R.id.button_second).setOnClickListener {
navigationInterface.closeActivity()
}
((your_activity) getActivity).method_name()
your_activity
はアクティビティmethod_name()
の名前で、呼び出したいメソッドの名前はどこにありますか。