从片段调用活动方法

382
尝试从片段中调用我的活动中的方法。我希望片段提供方法数据并在方法返回时获取数据。我想实现类似于调用静态方法,但不使用静态方法是因为它会在活动中创建问题。
对片段新手,需要简单易懂的解释!
谢谢!

https://dev59.com/fmgv5IYBdhLWcg3wBMSg#73796270 - Zahid Iqbal
18个回答

2

这是来自 Fragment 类的内容...

((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);

这段代码来自Activity类...

 public void values(String title_txts, String bannerImgUrl) {
    if (!title_txts.isEmpty()) {

//Do something to set text 
    }
    imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}

2
((your_activity) getActivity).method_name()

在这里,your_activity是您的活动名称,method_name()是您想要调用的方法名称。


1
我一直在寻找最好的方法来实现这个,因为我们想调用的并不是每个位于具有相同 Activity 父级的 Fragment 中的方法。
在你的 Fragment 中。
public void methodExemple(View view){

        // your code here

        Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show();
    }

在你的活动中。
new ExempleFragment().methodExemple(context); 

1

我尝试了本帖中提到的所有方法,但都没有起作用。尝试这个方法。它对我有效。

((MainActivity) getContext().getApplicationContext()).Method();

1

对于Kotlin,尝试一下

class DataForm : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        Tasks(this).getData()
    }

    fun getResponse(response: String) {
        // code
    }
}

class Tasks(private val context: Any) {
    fun getData() {

        val getContext = (context as DataForm).activity
        val getFragment = (context as DataForm)

        val responseListener = Response.Listener<String> { response ->
            getFragment.getResponse(response)
        }

        val errorListener = Response.ErrorListener { error ->
            error.printStackTrace();
        }

        val stringRequest = StringRequest(Request.Method.GET, url, responseListener, errorListener)
        Volley.newRequestQueue(getContext).add(stringRequest)
    }
}

我喜欢这个,因为它消除了孩子对父级的某种认知。代码片段不应直接调用父级方法。 - Droid Chris

0

我认为在初始化Fragment时,通过传递activity实例会是更好的方式。我像下面这样传递了实例:

class FragmentSignUp : Fragment() {

    private lateinit var authActivity: AuthenticateActivity

    ...
    
    companion object {

        fun newInstance(a: AuthenticateActivity): FragmentSignUp {
            val fragment = FragmentSignUp()
            fragment.authActivity = a
            return fragment
        }
    }
}

现在您可以使用传递的活动实例初始化片段,并且还可以调用活动中的任何公共方法。如下所示:

val fragmentManager = supportFragmentManager
val fragment = FragmentSignUp.newInstance(this)

fragmentManager.beginTransaction().replace(R.id.authenticate_fragment, fragment, FragmentSignUp::class.java.simpleName)
            .commit()

现在您可以在片段中访问您的活动公共方法;就像在我的情况下:
authactivity.goToLogInFragment()

在Java中,你的片段类应该是:

public class FragmentSignUp extends Fragment {

    private AuthenticateActivity authActivity;

    public static FragmentSignUp newInstance(AuthenticateActivity a) {
        FragmentSignUp fragment = new FragmentSignUp();
        fragment.authActivity = a;
        return fragment;
    }
}

注意:我们也可以直接将活动注入到片段构造函数中。但在大多数情况下,我们应该避免这样做,因为它可能会导致一些运行时问题。


0

从片段到活动:

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


0

((YourActivityName)getActivity()).functionName();

示例:((SessionActivity)getActivity()).changeFragment();

注意:类名应为public。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接