android从片段调用MainActivity函数

时间:2017-05-02 20:55:20

标签: java android android-fragments

我是android的新手,我试图抓住创建和使用Fragments。

我有一个片段,显示了一个可供选择的多个日期的简单列表,并实现了onClickListener。这个想法是用户选择一个日期后,片段将日期发送回MainActivity,然后MainActivity在数据库中运行查询并将数据库响应发送到另一个片段。

我坚持将日期发送回MainActivity,优雅。我找不到太多信息。我发现了这个:

 Activity activity = getActivity();
 if(activity instanceof MyActivity){
      MyActivity myactivity = (MyActivity) activity;
      myactivity.myMethod();
}

我对此非常陌生,但这对我来说似乎很骇人听闻。这是正确的方式还是有另一种方式?

赞赏任何输入

2 个答案:

答案 0 :(得分:2)

我更喜欢基于界面的方法,因为它很干净。您可以在Fragment或外部接口中声明嵌套接口:

interface OnMyStuffListener {
    void myMethod();
}

Activity实现该接口:

public class MainActivity extends Activity implements OnMyStuffListener {
    @Override
    public void myMethod() {
        // Do whatever you want.
    }
}

Fragment会附加到Activity,因此您可以检查Context的实例并将其投放到Activity

public class MyFragment extends Fragment implements View.OnClickListener {
    private OnMyStuffListener mListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnMyStuffListener) {
            mListener = (OnMyStuffListener) context;
        } else {
            throw new IllegalArgumentException("The context " + context.getClass().getName() +
                    "must implement " + OnMyStuffListener.class.getName());
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        // Release it avoiding memory leak.
        mListener = null;
    }


    @Override
    public void onClick(View v) {
        mListener.myMethod();
    }
}

答案 1 :(得分:1)

是的,这是绝对正确的。如果您不确定Fragment是否附加到Activity

,则可以使用此功能

您也可以使用Interface,使用EventBus LocalBroadcastManager,或使用Activity以及某种形式的Intent开始新flag来实现此目的。 extras已传入其EventListener捆绑包或其他内容。

以下是使用界面的示例:

1。将函数sendDataToActivity()添加到界面(//EventListener.java public interface EventListener { public void sendDataToActivity(String data); } )。

MainActivity

2。// MainActivity.java public class MainActivity extends AppCompatActivity implements EventListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void sendDataToActivity(String data) { Log.i("MainActivity", "sendDataToActivity: " + data); } }

中实施此功能
MyFragment

3。attachActivity中创建一个监听器到listener.sendDataToActivity("Hello World!")

4。最后,使用// MyFragment.java public class MyFragment extends Fragment { private EventListener listener; @Override public void onAttach(Activity activity) { super.onAttach(activity); if(activity instanceof EventListener) { listener = (EventListener)activity; } else { // Throw an error! } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // Send data listener.sendDataToActivity("Hello World!"); return view; } @Override public void onDetach() { super.onDetach(); listener = null; } } 调用函数。

free(pData)

希望这会有所帮助〜