361

フラグメントからアクティビティのメソッドを呼び出そうとしています。フラグメントがメソッド データを提供し、メソッドが返されたときにデータを取得する必要があります。静的メソッドの呼び出しと同様のことを実現したいのですが、アクティビティに問題が発生するため、静的を使用しません。

フラグメントは初めてなので、簡単で教育的な説明が必要です!

ありがとう!

4

17 に答える 17

909

フラグメントからアクティビティへ:

((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");
于 2012-09-30T08:23:29.280 に答える
221

フラグメントを別の場所で使用したい場合に備えて、フラグメントをアクティビティから分離するようにしてください。これを行うには、アクティビティが実装するインターフェイスを作成します。

したがって、次のようなインターフェイスを定義します。

たとえば、アクティビティに文字列を与え、整数を返すようにしたいとします。

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

最初の答えは間違いなく機能しますが、現在のフラグメントをホスト アクティビティと結び付けます。別のアクティビティでフラグメントを使用する場合に備えて、フラグメントをホスト アクティビティから切り離しておくことをお勧めします。

于 2012-10-02T02:05:40.827 に答える
9

私はマルコの回答が完全に好きですが、パブリッシュ/サブスクライブベースのフレームワークを使用して同じ結果を達成することもできることを指摘するのは公正だと思います。たとえば、イベントバスを使用する場合、次のことができます

フラグメント:

EventBus.getDefault().post(new DoSomeActionEvent()); 

アクティビティ:

 @Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something

}
于 2016-05-11T11:00:35.260 に答える
4

これが私がこれをした方法です:

最初の作成インターフェース

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()
}
于 2021-01-05T19:08:43.233 に答える
1
((your_activity) getActivity).method_name()

your_activityはアクティビティmethod_name()の名前で、呼び出したいメソッドの名前はどこにありますか。

于 2019-09-26T14:44:53.503 に答える