我是安卓新手,我正在尝试掌握创建和使用片段的窍门。
我有一个片段,它显示了多个日期的简单列表供您选择,并实现了 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
中创建侦听器并将其attach
到Activity
。
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;
}
}
希望这会有所帮助~