Android 如何从FragmentActivity中的按钮在片段中触发okclick事件

Android 如何从FragmentActivity中的按钮在片段中触发okclick事件,android,android-fragments,Android,Android Fragments,我正在尝试将Google+登录添加到我的应用程序。 我下面的演示如何在活动中设置所有内容,但是我尝试在片段中包含与登录逻辑有关的所有内容,同时在我的主要片段活动中使用“登录”按钮。 我是Android新手,所以我不知道该怎么做,但我想知道如何从FragmentActivity中的登录按钮触发片段中的onClick()事件(处理所有登录内容) 我已尝试将此添加到“在我的活动上创建”中: googleAuthButton.setOnClickListener(new View.OnClickList

我正在尝试将Google+登录添加到我的应用程序。 我下面的演示如何在活动中设置所有内容,但是我尝试在片段中包含与登录逻辑有关的所有内容,同时在我的主要片段活动中使用“登录”按钮。 我是Android新手,所以我不知道该怎么做,但我想知道如何从FragmentActivity中的登录按钮触发片段中的onClick()事件(处理所有登录内容)

我已尝试将此添加到“在我的活动上创建”中:

googleAuthButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            googlePlusFragment.onClick(v);
        }
    });
当然,这是行不通的。
我将非常感谢您的帮助。

您希望保持您的
活动
代码简单易读,这并没有错。但是
片段
方法很奇怪。背景片段有它们的位置,但这不是其中之一。我认为您需要做的就是为每个登录函数创建一个新的
类。然后,当按下右键时,可以调用该类,并以这种方式将实际日志外包。基本设置是这样的

googleAuthButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        GoogleLogIn logIn = new GoogleLogIn(new LoggedInListener(){

            @Override
            public void loggedIn(String whatever){
                      //if you need info from the log in use it here
            }

        });
        logIn.logMeIn(value);
    }
});
然后在你的GoogleLogInClass里

    public class GoogleLogIn{

        private LoggedInListener listener;       

        public GoogleLogIn(LoggedInListener listener){
            this.listener = listener; 
        }

        public void logMeIn(String info){
           //whatever you need to do to log in
           if(someConditionTrue){
               listener.loggedIn(someValueReturned);
           } else {
               listener.loggedIn(someValueThatIsFalse);
           }
        }
    }
我的总体想法是将逻辑移动到一个类中,单击按钮即可调用该类。然后你可以调用一些方法来做你想做的事情。您可以使用回调从登录类获得反馈,该回调将向宿主活动返回您需要的任何内容,以便以后使用

我不知道登录google+或facebook需要什么,所以现在这是我能做的最好的了。如果您只需要传递一些数据并返回一个响应,那么只需登录类extend
AsyncTask
并以这种方式实现日志,就可以进一步简化工作。调用execute()时,只需将值作为参数传入即可

编辑-从XML调用方法 如果上面的代码因为嵌套的callabcks而显得太疯狂,那么您可以让它变得更简单。在声明按钮的XML中,可以添加一个
onClick
选项。这允许您在按下按钮时调用的活动中指定公共方法。没有回电。别胡说八道。如果您遵循这种方法,您只需添加以下内容

public void nameThisMethodWhateverYouWant(View v){
    /call your log in class here
}

这更容易阅读。我觉得XMLOnClick函数只是在某个API级别之后才添加的,但在支持包中,我个人将其运行到了2.3.6,没有任何问题

你为什么不在你的片段中移动“登录”的东西,让你的活动去做呢?因为按钮就在那里,这样做更有意义。你可以随时从片段中调用一个方法,在按钮点击上做你想做的事情。我在同一活动中也有Facebook的登录选项,因此我希望在两个不同片段上都有这两个选项的登录逻辑,并使活动尽可能轻松。至少,这是我的逻辑。我不确定这是否是最好的约定。就像我说的,你总是可以在你的片段中创建一个公共方法,并在点击按钮时调用它。我很困惑-你在使用一个没有UI的片段来处理活动中按钮的登录?如果您只是想将处理登录的代码移开,就像异步任务一样,只需创建一个单独的登录类。它当前的设置似乎很奇怪。阅读本文,我的问题是代码被设计为一个片段,而活动被设计为一个活动。因此,它们重写了一组父方法,所以我的问题是我不知道如何将这些模型转换为泛型类(例如,如何以泛型方式设置它们的onCreate()方法中包含的所有内容)@Archer2486你真正需要做的是阅读我在评论中给你的关于如何与活动沟通的链接,这是你真正的问题。这样,一切都像它应该的那样在一个片段中,而您的活动也像它一样处理它should@tyczj你发布的链接看起来确实有用。现在就通读一遍。谢谢。@Archer2486您需要您的片段与活动进行通信,这正是我与您链接的内容。如果您必须使用片段,您只需使用一个接口即可从片段访问活动。然后,当您想做的事情完成时,您可以调用该活动。