0

私は、インターフェイスを使用して、あるフラグメントから別のフラグメントにデータを送信しています。これは絶対にうまくいく。今、onSaveInstanceState()を使用して、 の値をフラグメントに保存し、onCreate()で取得しようとしています。しかし、私はonCreate()のバンドルでnullになっています。 P.S.フラグメントをXMLのアクティビティレイアウトに直接設定すると、すべて正常に動作します。しかし、私は、アクティビティにJavaコードを介してフラグメントを設定すると、onSaveInstanceStateは失敗しています。最後の既知の値を保存していません。助けてください。以下のコードを貼り付けます。あなたは正確な問題を知るためにそれを試すことができます。Fragment Layoutsを動的に設定して、Interfaceを使用してFragment to Fragmentにデータを送信します。保存されたフラグメントのインスタンスが動作していません

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> 

答えて

0

IはFragment_Aにおけるボタンの初期化中getViewメソッド()の代わりにgetActivity()を使用していたが見つかりましたsoluion。 を使用します。btnAdd =(Button)getView()。findViewById(R.id.btnAdd); の代わりに btnAdd =(ボタン)getActivity()。findViewById(R.id.btnAdd);

ただし、Fragment_BでgetView()を使用することはできません。 Textviewがフリーズし、onSaveInstanceStat()が機能しません。解決策を提案してください。

関連する問題