我是android的新手,我试图抓住创建和使用Fragments。
我有一个片段,显示了一个可供选择的多个日期的简单列表,并实现了onClickListener。这个想法是用户选择一个日期后,片段将日期发送回MainActivity,然后MainActivity在数据库中运行查询并将数据库响应发送到另一个片段。
我坚持将日期发送回MainActivity,优雅。我找不到太多信息。我发现了这个:
Activity activity = getActivity();
if(activity instanceof MyActivity){
MyActivity myactivity = (MyActivity) activity;
myactivity.myMethod();
}
我对此非常陌生,但这对我来说似乎很骇人听闻。这是正确的方式还是有另一种方式?
赞赏任何输入
答案 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。在attach
和Activity
中创建一个监听器到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)
希望这会有所帮助〜