试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。

新的片段,所以我需要一个简单的和教学的解释!

谢谢!


当前回答

对于Kotlin开发人员

(activity as YourActivityClassName).methodName()

针对Java开发人员

((YourActivityClassName) getActivity()).methodName();

其他回答

更新后,我了解更多的碎片如何工作。每个片段都属于一个父活动。所以只需使用:

getActivity().whatever

从片段内部。这是一个更好的答案,因为可以避免多余的类型转换。如果这个解决方案不能避免强制转换,请使用下面的方法。

============

你要做的就是投射到外部活动

((MainActivity) getActivity()).Method();

创建一个新的实例将使android框架感到困惑,它将无法识别它。 参见:

https://stackoverflow.com/a/12014834/1984636

https://stackoverflow.com/a/2042829/1984636

谢谢@BIJAY_JHA和@Manaus。我使用Kotlin版本来调用我的signIn()方法,该方法存在于活动中,并且我从一个片段中调用。我在Android中使用导航架构,所以监听器接口模式不在片段中:

 (activity as MainActivity).signIn() 

您可能应该尝试将片段与活动解耦,以防您想在其他地方使用它。您可以通过创建您的活动实现的接口来做到这一点。

所以你会像下面这样定义一个接口:

例如,假设你想给活动一个String,并让它返回一个Integer:

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. */
            }
        }

    }

edit(17.12.2015):onAttach(Activity Activity)已弃用,改用onAttach(Context Context),它按预期工作

第一个答案肯定有效,但它将当前片段与宿主活动结合在一起。如果你想在另一个活动中使用它,保持片段与宿主活动解耦是很好的做法。

((your_activity) getActivity).method_name()

your_activity是你活动的名称,method_name()是你想调用的方法的名称。

从碎片到活动:

((YourActivityClassName) requireActivity ()) .yourPublicMethod ();