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

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

谢谢!


当前回答

从它们各自的片段调用活动方法的最佳方法

(activity as YourActivity).activtiyMethod()

使用你活动中的这句话。例如

假设你有活动A和方法add()和片段ABC,你想从片段ABC调用方法add,

(activity as A).add()

其他回答

我已经尝试了这个线程中显示的所有方法,没有一个对我有效,试试这个。这对我很管用。

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

我认为在片段初始化时传递活动实例是一个更好的方法。我像下面这样传递实例:

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()

你现在可以在你的片段中访问你的activity公共方法;就像我的例子:

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;
    }
}

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

以下是我的做法:

首先制作接口

interface NavigationInterface {
    fun closeActivity()
}

接下来确保activity实现了接口并覆盖了接口方法

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()
}

这是来自片段类…

((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);
}

从它们各自的片段调用活动方法的最佳方法

(activity as YourActivity).activtiyMethod()

使用你活动中的这句话。例如

假设你有活动A和方法add()和片段ABC,你想从片段ABC调用方法add,

(activity as A).add()