簡體   English   中英

通過動態設置片段布局,使用接口將數據從片段發送到片段。 片段的已保存實例不起作用

[英]Sending data from Fragment to Fragment using Interface, by setting Fragment Layouts dynamically. Saved instance of Fragment NOT working

我正在使用接口將數據從一個片段發送到另一個片段。 這絕對好用。 現在,我嘗試使用onSaveInstanceState()將值保存在Fragment中並在onCreate()中進行檢索。 但是我在onCreate()捆綁包中為null。 PS當我將Fragment直接設置為xml中的活動布局時,一切正常。 但是,當我通過Java代碼將片段設置為活動時,onSaveInstanceState失敗。 它不會保存最后的已知值。 請幫忙。 粘貼下面的代碼。 您可以嘗試一下以了解確切的問題。

Fragment_A:

public class Fragment_A extends Fragment implements View.OnClickListener {

Button btnAdd;
int counter = 0;
Communicator comm;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState != null){
        counter = savedInstanceState.getInt("counter", 0);
    }
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_a, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    comm = (Communicator) getActivity();
    btnAdd = (Button) getActivity().findViewById(R.id.btnAdd);
    btnAdd.setOnClickListener(this);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("counter", counter);
}

@Override
public void onClick(View v) {
    counter++;
    comm.sendData(counter);
}
}


interface Communicator{
    void sendData(int i);
}

=====

活動內容:

public class Activity_InterComm extends Activity implements Communicator{

FragmentManager manager;
FragmentTransaction transaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intercomm);

    Fragment_A fragment_1 = new Fragment_A();
    Fragment_B fragment_2 = new Fragment_B();

    manager = getFragmentManager();
    transaction = manager.beginTransaction();

    transaction.add(R.id.frag_a, fragment_1, "Frag1");
    transaction.add(R.id.frag_b, fragment_2, "Frag2");
    transaction.commit();
}

@Override
public void sendData(int i) {
    manager = getFragmentManager();
    Fragment_B fragment_b = (Fragment_B) manager.findFragmentById(R.id.frag_b);
    fragment_b.setData("Button has been clicked " + i + " times");
}
}

=====

Fragment_B:

public class Fragment_B extends Fragment {

TextView txtMessage;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_b, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    txtMessage = (TextView) getActivity().findViewById(R.id.txtMessage);
}

public void setData(String message){
    txtMessage.setText(message);
}
}

activity_intercomm.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<!--<fragment
    android:id="@+id/frag_a"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginBottom="8dp"
    android:layout_weight="1"
    android:name="android.learning.com.fragintercomm.Fragment_A"/>

<fragment
    android:id="@+id/frag_b"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:name="android.learning.com.fragintercomm.Fragment_B"/>-->

<LinearLayout
    android:id="@+id/frag_a"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginBottom="8dp"
    android:layout_weight="1"
    android:background="@color/colorAccent"
    android:orientation="vertical"/>

<LinearLayout
    android:id="@+id/frag_b"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginBottom="8dp"
    android:layout_weight="1"
    android:background="@color/colorPrimaryDark"
    android:orientation="vertical"/>

</LinearLayout>

我發現的解決方案是在Fragment_A中初始化按鈕時使用getView()而不是getActivity()。 使用btnAdd =(Button)getView()。findViewById(R.id.btnAdd); 而不是btnAdd =(Button)getActivity()。findViewById(R.id.btnAdd);

但是,您不能在Fragment_B中使用getView()。 Textview凍結,並且onSaveInstanceStat()不起作用。 請提出解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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