ここに初めて投稿し、Android アプリの新しい開発者でもあります。
サンプルアプリの欲望関数:
1) アクティビティはフルスクリーン A で開始されます
2) フラグメント B は、A のコンテナを全画面表示/展開します。
3) フラグメント B にはボタンがあり、ボタンが押されている
4) フラグメント B がフラグメント C に置き換えられました
5) フラグメント C が全画面表示になり、ユーザーが入力したデータが表示されます。ユーザーはボタンを押して次のフラグメントに送信します
6) フラグメント C はフラグメント D に置き換えられ、フラグメント C から入力されたデータをビューに提示します。
要約機能:
1 つの画面ですべてを維持しようとしています。
A (アクティビティ) -> B (フラグメントの置換) -> C (型データへのフラグメントの置換) -> D (フラグメントの置換と最後のフラグメント データの参照)
問題/問題
最後の画面に明らかにデータを入力しようとすると、コードがクラッシュします。デバッグすると、この特定の行で MainActivity にエラーがスローされるようです
CartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer);
作成したインターフェイスを介して値を正しく渡していることは間違いありませんが、デバッグプロセス中に、現在のプログラムがフラグメントを置き換えるためにまだコミットしていないように見えるため、同じコンテナーに情報を入力しようとしていることがわかりました変数を適切な UI に割り当てます。
フラグメント C を D に置き換えることができるかどうかを確認していましたが、上記のコード行を削除した場合にのみ可能でした。
以下のコード
主要
public class MainActivity extends FragmentActivity implements OrderFragmentCode.FragUIListeners{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment AllMenu = new AllMenuFragmentCode();
FragmentManager fragManager = getSupportFragmentManager(); //getSupportFragmentManager setup
FragmentTransaction ft = fragManager.beginTransaction(); //setup fragmentTranscation = ft
ft.add(R.id.maincontainer, AllMenu);
ft.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onCartButtonClicked(String editFood, String editType, String editName){
CartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer);
addCartInfoTextFragment.UpdateCartTexts(editFood, editType, editName);
}}
フラグメントA
public class AllMenuFragmentCode extends Fragment implements OnClickListener {
private Button Order;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.all_menu_fragment, container, false);
Order = (Button) view.findViewById(R.id.orderButton);
Order.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Fragment OrderFragmentCode = new OrderFragmentCode();
FragmentManager fragManager = getFragmentManager(); //getSupportFragmentManager setup
FragmentTransaction ft = fragManager.beginTransaction(); //setup fragmentTranscation = ft
ft.replace(R.id.maincontainer, OrderFragmentCode);
ft.addToBackStack(null);
ft.commit();
}}
フラグメント C
public class OrderFragmentCode extends Fragment implements OnClickListener {
FragUIListeners activityCallback;
public interface FragUIListeners {
public void onCartButtonClicked(String foodText, String typeText, String nameText);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
activityCallback = (FragUIListeners) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement FragUIListeners");
}
}
private EditText editTextFood;
private EditText editTextType;
private EditText editTextName;
private Button AddToCartButton;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.order_fragment, container, false);
editTextFood = (EditText) view.findViewById(R.id.editText);
editTextType = (EditText) view.findViewById(R.id.editText2);
editTextName = (EditText) view.findViewById(R.id.editText3);
AddToCartButton = (Button) view.findViewById(R.id.addToCart);
AddToCartButton.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Fragment Cart = new CartFragmentCode();
FragmentManager fragManager = getFragmentManager();
FragmentTransaction ft = fragManager.beginTransaction();
ft.replace(R.id.maincontainer, Cart);
ft.addToBackStack(null);
ft.commit();
activityCallback.onCartButtonClicked(editTextFood.getText().toString(), editTextType.getText().toString(), editTextName.getText().toString());
}}
フラグメントD
public class CartFragmentCode extends Fragment{
private TextView foodView;
private TextView typeView;
private TextView nameView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.cart_fragment, container, false);
foodView = (TextView) view.findViewById(R.id.foodView);
typeView = (TextView) view.findViewById(R.id.typeView);
nameView = (TextView) view.findViewById(R.id.nameView);
return view;
}
public void UpdateCartTexts(String editfood, String edittype, String editname)
{
foodView.setText(editfood);
typeView.setText(edittype);
nameView.setText(editname);
}}
--最後に--長い投稿で申し訳ありませんが、これは何時間も悩まされており、バンドルを使用して引数を設定しようとさえしましたが、どちらも機能しませんでした(値を正しく取得できたかどうか考えました)これを回避し、これを使用して、最後のフラグメントの getArguments を介してテキストビューに値を割り当てることができます)。