簡體   English   中英

將數據從片段傳遞到活動,然后傳遞到另一個片段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM