android 从片段调用 MainActivity 函数



我是安卓新手,我正在尝试掌握创建和使用片段的窍门。

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

我被困在将日期优雅地发送回 MainActivity 的地步上。我找不到太多信息。我发现这个:

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

我对此很陌生,但这对我来说似乎很笨拙。这是正确的方法还是有其他方法?

任何输入都值得赞赏

我更喜欢基于接口的方法,因为它非常干净。您可以在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();
}
}

是的,这是绝对正确的。如果您不确定您的Fragment是否附加到Activity,则可以使用它

您也可以通过以下方式实现Interface,使用像LocalBroadcastManager这样的EventBus,或者使用Intent和某种形式的flag传递到其extras捆绑包或其他东西中启动新Activity

下面是有关使用界面的示例:

1.在接口中添加函数 sendDataToActivity() (EventListener)。

//EventListener.java
public interface EventListener {
public void sendDataToActivity(String data);
}

2.在您的MainActivity中实现此功能。

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

3.MyFragment中创建侦听器并将其attachActivity

4.最后,使用listener.sendDataToActivity("Hello World!")调用函数。

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

希望这会有所帮助~

最新更新