![](/img/trans.png)
[英]Pass data from Activity to Fragment in another Activity
[英]Pass data from fragment to activity and then to another fragment
我是零碎溝通的新手,所以我真的需要您的幫助。 我有一個片段活動和兩個片段。
在我的Fragment A中 ,我有一個edittext (默認值為null),用戶必須在其中輸入一個數字。 因此,為了捕獲輸入值,我使用addTextChangedListener做到了這一點。 並且,在捕獲了edittext的新值之后, 片段A必須將該值(字符串)傳遞給容器活動,並且此活動現在已接收到該值(字符串)。 現在,此活動必須將值(字符串)傳遞給片段B。
到目前為止,這是我嘗試過的
FragmentActivity:
public String strDocNum;
@Override
public void onDataPass(String data) {
// TODO Auto-generated method stub
Log.d("Document From", data);
strDocNum = data;
}
片段A:
OnDataPass dataPasser;
private void getRecords() {
// TODO getRecords
// TODO To call methods from fragment to activity
((ReceivingStocks)getActivity()).dbConnect();
strLastDocumentNumber = ((ReceivingStocks)getActivity()).dbHelper.getLastDocumentNumber();
Log.d("Doc Num", "" + strLastDocumentNumber);
etDocumentNumber.setText(strLastDocumentNumber);
etDocumentFrom.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// TODO afterTextChanged
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
System.out.println("Before text changed " + new String(s.toString()));
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
System.out.println("Ontext changed " + new String(s.toString()));
if(s.toString().isEmpty()){
} else {
strDocumentFrom = s.toString();
strTransactionDate =
((ReceivingStocks)getActivity()).dbHelper.getTransactionDateByDocumentNumber(strDocumentFrom);
strTotalAmount =
((ReceivingStocks)getActivity()).dbHelper.getTotalAmountByDocumentNumber(strDocumentFrom);
strVan =
((ReceivingStocks)getActivity()).dbHelper.getVanByDocumentNumber(strDocumentFrom);
etTransactionDate.setText(strTransactionDate);
etTotalAmount.setText(strTotalAmount);
Log.d("Van", "" + strVan);
etVan.setText(strVan);
// TODO TO PASS DATA FROM FRAGMENT TO ACTIVITY
dataPasser.onDataPass(strDocumentFrom);
}
}
});
}
public interface OnDataPass {
public void onDataPass(String data);
}
public void passData(String data) {
dataPasser.onDataPass(data);
}
@Override
public void onAttach(Activity a) {
super.onAttach(a);
dataPasser = (OnDataPass) a;
}
片段B:
private void getRecords() {
// TODO getRecords
// TODO To call methods from fragment to activity
((ReceivingStocks)getActivity()).dbConnect();
String mLabel = ((ReceivingStocks)getActivity()).strDocNum;
Log.d("Document Number From Header", "" + mLabel);
strUnitOfMeasure = ((ReceivingStocks)getActivity()).dbHelper.getUnitOfMeasureByDocumentNumber(mLabel);
strQTY = ((ReceivingStocks)getActivity()).dbHelper.getQTYByDocumentNumber(mLabel);
strUnitPrice = ((ReceivingStocks)getActivity()).dbHelper.getUnitPriceByDocumentNumber(mLabel);
strAmount = ((ReceivingStocks)getActivity()).dbHelper.getAmountByDocumentNumber(mLabel);
try{
if(mLabel.isEmpty()){
} else {
String str = ((ReceivingStocks)getActivity()).dbHelper.getItemCodeByDocumentNumber(mLabel);
Log.d("Item Code", "" + str);
etItemCode.setText(str);
etUnitOfMeasure.setText(strUnitOfMeasure);
etQuantity.setText(strQTY);
etUnitPrice.setText(strUnitPrice);
etAmount.setText(strAmount);
}
} catch(SQLiteException e){
Log.d("Error", "" + e);
}
}
到目前為止,我已經成功地將數據從Fragment A傳遞到Activity。 但是從Activity到Fragment B,它傳遞的默認值為null,因此我的logcat拋出NullPointerException。 有任何想法嗎? 我真的迷路了。 您的幫助將得到我的真正感謝。 謝謝。
如果您的要求是將價值從一個片段傳遞到另一個片段,則嘗試使用捆綁包
例如:
TalkDetail fragment = new TalkDetail();
Bundle bundle = new Bundle();
bundle.putString("title", title);
bundle.putString("largeimg", largeimg);
bundle.putString("excert", excert);
bundle.putString("description",description);
bundle.putString("cat", cat);
bundle.putString("header_title", "Talk");
//bundle.putInt("postid", postid);
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
這是您的BaseContainerFragment.java類,將有助於獲得更好的跟蹤和其他優點
public class BaseContainerFragment extends Fragment {
public void replaceFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.replace(R.id.container_framelayout, fragment);
transaction.commit();
getChildFragmentManager().executePendingTransactions();
}
public boolean popFragment() {
Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount());
boolean isPop = false;
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
isPop = true;
getChildFragmentManager().popBackStack();
}
return isPop;
}
}
我建議您看一下這篇文章: http : //www.vogella.com/articles/AndroidFragments/article.html
它說明了如何使用偵聽器模式將數據從片段傳遞到活動,以及如何將數據從活動傳遞到另一個片段。
根據您的描述和本文,您的代碼應如下所示:
FragmentB fragment = (FragmentB) getFragmentManager().findFragmentById(R.id.fragmentb);
if (fragment != null && fragment.isInLayout()) {
fragment.passData(data);
}
嘗試這個 :
public class FragmentA extends Fragment{
private Callbacks mCallbacks = sCallbacks;
public interface Callbacks {
public void onSelected();//Add arguments if you wants
}
private static Callbacks sCallbacks = new Callbacks() {
@Override
public void onSelected() {
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_fragment_layout,container, false);
Button btn=(Button)rootView.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListenet{
public void onClick(View v){
mCallbacks.onSelected()
}
});
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException(
"Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = sCallbacks;
}
}
public class YourFragmentActivity extends FragmentActivity
implements FragmentA.Callbacks{
FragmentB fragB;
@Override
public void onSelected() {
// Handle fragmentA's btn click event here
// you can call any function of fragmentB using its instance 'fragB'
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen);
FragmentTransaction ft =getSupportFragmentManager().beginTransaction();
fragB = new FragmentB();
/* //Pass values to FragmentB
Bundle arguments = new Bundle();
arguments.putSString("MyString", "your string comes here");
fragB.setArguments(arguments);
*/
ft.replace(R.id.fragB_container, fragB).commit();
}
}
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:baselineAligned="false" >
<FrameLayout
android:id="@+id/fragA_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/fragB_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
在片段中定義一個接口,使活動實現該接口,然后從片段中調用這些接口方法以將數據傳遞給活動。
從活動中調用片段的公共方法,以將數據傳遞給該片段。
兩個片段永遠不要直接通信。
在這里進行了詳細說明: http : //developer.android.com/training/basics/fragments/communicating.html
在Fragment之間傳輸數據的聰明方法是通過接口。 在這里,片段無法直接相互通信。 但是您可以通過活動來完成。 在這里,活動將充當中間人。
在這種情況下,您需要兩個接口。 一個接口用於Activity,另一個接口用於FragmentB。
FragmentA通過Activity接口將EditTextValue發送到Activity,獲得此值后Activity將使用FragmentB接口將該值傳遞給FragmentB。
這是示例代碼:
活動將實現此接口:
public interface IActivityTest {
public void getValueFromFragmentA(String value);
}
FragmentB將實現此接口:
public interface IFragmentB {
public void getValueFromEditTextInFragmentA(String value);
}
在FragmentA中更改edittext值之后,它將調用此Activity的getValueFromFragmentA
方法。
(IActivityTest)getActivity()).getValueFromFragmentA("YOUR_EDITTEXT_NEW_VALUE");
在獲得此值之后,Activity將使用下面的方式將此值傳遞給FragmentB-之后,Activity將在此處獲得此EditText值
@Override
public void getValueFromFragmentA(String value) {
YourFragmentBInstance.getValueFromEditTextInFragmentA(value);
}
現在,此值將通過以下方法傳遞給FragmentB:
@Override
public void getValueFromEditTextInFragmentA(String value){
// Here value is your desired value.
}
完整的源代碼和相關答案是這里在我的答案。
謝謝 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.