-1

ここに初めて投稿し、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 を介してテキストビューに値を割り当てることができます)。

助けてください!!!!ありがとう!!!

4

3 に答える 3

0

たとえば、このフラグメントを取得する場合は、フラグメントに関連付けられているタグを使用しCartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer); findFragmentByIdます。そのフラグメントが表示されているコンテナです。addft.add(R.id.maincontainer, AllMenu);findFragmentById(AllMenu)R.id.maincontainer

于 2013-11-11T08:59:29.547 に答える
0

onCartButtonClicked問題は、フラグメント C (フラグメント C がまだ存在する場所) 内で呼び出しているため、フラグメント D が作成されず、まだ C の場所を取ることだと思います。

あなたonCartButtonClickedHandler_MainActivity

于 2013-11-11T09:11:58.347 に答える
-1

これは、ソリューションを模倣するための当時の私のリソースの 1 つでした (彼は 1 つのアクティビティで 2 つのフラグメントを使用していましたが、私のアプリは 1 つのアクティビティを使用してメイン フレームレイアウトを置き換えようとしていました): http://www.techotopia.com/ index.php/Using_Fragments_in_Android_-_A_Worked_Example

サンプルコードで遊んで、利用可能なドキュメントを使用した後。MainActivity で提案されているように、これらの 2 行を使用して情報を転送することはできません。

CartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer); 
addCartInfoTextFragment.UpdateCartTexts(editFood, editType, editName);

最終的に回避策または解決策を見つけたと思いますか? これがフラグメントや他のクラスに情報を渡す正しい方法かどうかはわかりませんが、ここにあります...

私は基本的にこれらの2行を取り除き、MainActivityのClickメソッドを作り直して、これに変更しました...

public void onCartButtonClicked(String editFood, String editType, String editName){
    CartFragmentCode.passFood = editFood;
    CartFragmentCode.passType = editType;
    CartFragmentCode.passName = editName;
}

次に、OrderFragmentCode.java である最後のフラグメントコードに移動し、文字列を宣言してクラスの先頭でそれらを取得すると、それらは...

 public static String passFood;
 public static String passType;
 public static String passName;

次に、これらの値を取り、textViews に setText を設定しました。ワラ!意図したとおりに機能しますが、これが正しい方法であるかどうかはわかりません...複数のフラグメントにまたがるデータを処理するためのより専門的な方法を見つけられる場合は、お知らせください!

于 2013-11-12T05:22:40.253 に答える