从Fragment调用Activity方法

时间:2016-04-14 16:27:41

标签: c# android android-fragments xamarin fragment

我正在使用ToDoActiviy.cs进行用户登录,这个类有这个方法:

[Java.Interop.Export()]

public async void LoginUser(View view) { if(await authenticate())..

从Button小部件android:onClick="LoginUser"中的.axml文件调用此方法我为android:onClick="LoginUserClick"更改了此方法。此最后一个方法创建一个对话框片段,用于显示不同的登录帐户。

现在从Dialog Fragment(位于另一个类)我想要按下对话框片段上的按钮点击事件,并从ToDoActivity.cs调用此方法。

在对话框片段类中,我按下这样的点击事件:

private void ButtonSignInFacebook_Click(object sender, EventArgs args){

//Here code for call to LoginUser method from 'ToDoActivity.cs' ToDoActiviy.cs act = new ToDoActivity(); act.LoginUser(); }

我需要传递一个视图,但我尝试了很多东西和任何工作..

有人可以帮助我吗?

提前致谢;)

5 个答案:

答案 0 :(得分:3)

我想对@ guido-gabriel的回答略作修改。

在C#语法中,它将是

((ToDoActivity)Activity).yourPublicMethod();

Java中的Getter / Setter方法映射到Xamarin.Android中的Getter Setter属性

答案 1 :(得分:1)

最后我修好了!我不得不更改方法的参数并创建它没有参数..现在正在工作。两种解决方案都很好:

//ToDoActivity act = new ToDoActivity(); //act.LoginUserFacebook(); class (Eq a, Show a) => C a where

答案 2 :(得分:0)

您必须从活动中调用该方法。你试过吗?

((YourActivityClassName)getActivity()).yourPublicMethod();

((ToDoActivity)getActivity()).yourPublicMethod();

答案 3 :(得分:0)

在片段中调整并使用下面的剪辑

var casted = Activity as MyActivityName;

    if (casted != null) {
        casted.IWantToCallThisMethodFromMyFragment();
    }

答案 4 :(得分:0)

这不是一个好习惯。为什么呢?

这样做会将Fragment紧密地耦合到这个特定的Activity类型,这意味着无法在代码中的其他地方重用Fragment。

相反,我建议您依靠活动订阅一个事件或实现某种回调方法,以便在登录后执行所需的操作。

看起来你的Activity可能包含很多可以拆分成某种共享库的逻辑。使得可以在另一个平台上重用该代码,例如将来的iOS。

因此,由于你负责新片段,我会做这样的事情:

public class LoginFragment : Fragment
{
    Action _onLoggedIn;

    public static void NewInstance(Action onLoggedIn)
    {
        var fragment = new LoginFragment();
        fragment._onLoggedIn = onLoggedIn;

        return fragment;
    }

    private void Login()
    {
        // login user
        // after loggedin
        _onLoggedIn?.Invoke();
    }
}

然后在你的活动中:

private void LoginUser()
{
    // whatever
}

var loginFragment = LoginFragment.NewInstance(LoginUser);
// fragment transaction here...