我有4個選項卡,每選中一個片段。
從選項卡#2片段我想要啓動另一個片段在選項卡#2上運行並從中獲取結果。什麼是正確的方法來做到這一點?有沒有例子?什麼是startActivityForResult()的模擬,但使用片段
如果這些是活動,而不是片段,我知道我會用startActivityForResult()。
我有4個選項卡,每選中一個片段。
從選項卡#2片段我想要啓動另一個片段在選項卡#2上運行並從中獲取結果。什麼是正確的方法來做到這一點?有沒有例子?什麼是startActivityForResult()的模擬,但使用片段
如果這些是活動,而不是片段,我知道我會用startActivityForResult()。
有一個片段交互的推薦模式。您的每一個片段的聲明它需要與使用接口他人互動的方式:
這裏的第一個片段的代碼:
public class Fragment1 {
private Listener listener;
@Override
public void onCreateView(...) {
Bundle args=getArguments();
if (args!=null) {
Object arg=args.getParcelable("result");
//use the result for something
}
//...
someView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener!=null)
listener.onFragment2Requested();
}
});
//...
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.listener=(Listener) activity;
}
public interface Listener {
public void onFragment2Requested();
}
}
和第二個片段:
public class Fragment2 {
private Listener listener;
@Override
public void onCreateView(...) {
//...
someView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Object object=...
if (listener!=null)
listener.onWorkDone(object);
}
});
//...
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//will throw ClassCastException unless your Activity
//implements Listener interface of your fragment
this.listener=(Listener) activity;
}
public interface Listener {
public void onWorkDone(Object someResult);
public void someOtherMethod();
}
}
,然後,最後,你的Activity
,作爲協調者:
public class YourActivity extends
FragmentActivity
implements
Fragment1.Listener,
Fragment2.Listener {
public void onFragment2Requested() {
Fragment2 frg2=new Fragment2();
//here goes your code to switch fragments the way you want
}
public void onWorkDone(Object someResult) {
//if you don't want to create new instance of fragment each time
//you can try to get it from FragmentManager.
//But don't try to store reference to it anywhere (activity field etc.)
//it could interfere with fragment recycling mechanism
Fragment1 frg1=new Fragment1();
Bundle args=new Bundle();
args.putParcelable("result", someResult);
//instead of arguments, you could use setter method, but that way
//your Object is lost when fragment is recreated upon orientation change, etc.
frg1.setArguments(args);
//here goes your code to switch fragments the way you want
}
public void someOtherMethod() {
//...
}
}
我知道,這可能看起來太多代碼,但這是它完成的方式。 此外,此模式涵蓋了in this article。
我試過了,它工作正常。我認爲正確的範例是創建一個具有兩個接口的基本片段類。第一個接口具有'startFragmentForResult(tag,requestCode)'方法,第二個接口具有'onFragmentResult(requestCode,resultCode,data)',並從中擴展所有片段。這是我的下一步。 – ilomambo
您需要自行處理,不存在片段的startActivityForResult()機制。 – Luksprog
@Luksprog我想你是對的,看到一個工作解決方案的接受答案。 – ilomambo