从片段中调用Activity的函数

时间:2016-10-01 02:19:46

标签: android android-fragments

我想从fragment2调用MainActivity的函数Ask()。 如何从fragment2调用MainActivity的函数? 我想将结果导入到从fragment2调用的页面中。

编辑: 我已经看到了这个讨论,但没有解决我的问题。

3 个答案:

答案 0 :(得分:0)

将该函数设为静态,之后您可以在Fragment中访问该函数,例如MainActivity.Ask();

答案 1 :(得分:0)

从片段到激活:

FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
YourFragmentClass fragment =    (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

从活动到片段:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

如果您在添加片段时通过代码添加片段并使用了标记字符串,请改用findFragmentByTag:

DECLARE SickHours CURSOR FOR  
select distinct e.BusinessEntityID, p.FirstName, p.LastName, e.JobTitle, e.SickLeaveHours, 
round(eph.Rate, 2) as NewHourlyRate
from Person.Person p 
inner join HumanResources.Employee e 
on p.BusinessEntityID = e.BusinessEntityID
inner join HumanResources.EmployeePayHistory eph
on e.BusinessEntityID = eph.BusinessEntityID
where e.SickLeaveHours <= 20; 
OPEN SickHours;  
FETCH NEXT FROM SickHours;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  
      update HumanResources.EmployeePayHistory
      set Rate = (Rate * 1.1), ModifiedDate = GETDATE()     
      FETCH NEXT FROM SickHours;  
   END;  
CLOSE SickHours;  
DEALLOCATE SickHours;  
GO  

干杯!

答案 2 :(得分:0)

我建议你阅读this documentation

  

从fragment2调用MainActivity的函数Ask()。

为此,您需要在interface中创建fragment2。以下代码是文档中的示例。您也不应该忽略片段中的onAttach方法。

public class Fragment2 extends ListFragment {
    OnCallActivityListener mCallback;

    // Container Activity must implement this interface
    public interface OnCallActivityListener {
        public void callAskMethod();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnCallActivityListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

现在,片段可以通过使用callAskMethod()接口的mCallback实例调用OnCallActivityListener方法(或接口中的其他方法)来向活动传递消息。

例如,当用户单击列表项时,将调用片段中的以下方法。该片段使用回调接口将事件传递给父活动。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // Send the event to the host activity
    mCallback.callAskMethod();
}

之后,您应该在主机活动中实现该接口。

public static class MainActivity extends Activity
        implements Fragment2.OnCallActivityListener{
    ...

    public void callAskMethod() {
        // Do something here 
        ask();
    }
}

就是这样。您已从ask()片段调用fragment2方法。

  

我想将结果导入到从fragment2调用的页面中。

主机活动可以通过使用Fragment捕获findFragmentById()实例来向片段传递消息,然后直接调用片段的公共方法。

在你的`MainActivity中,你可以调用将结果发送到片​​段。

Fragment2 fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.article_fragment);

因此,您在Fragment2中拥有MainActivity的实例值。因此,您可以使用fragment2的任何公共方法。

例如

fragment2.doSomething();

就是这样。