-1

第一次在这里发帖,也是安卓应用的新开发者。

示例应用的愿望功能:

1) Activity 以全屏方式启动 A

2) Fragment B 然后填充/膨胀 A 全屏的容器

3)片段B有一个按钮,按钮是按下

4) 片段 B 现在替换为片段 C

5) Fragment C 现在是全屏的,并且有用户输入的数据,然后用户点击按钮发送到下一个 Fragment

6) 将片段 C 替换为片段 D,并将从片段 C 输入的数据呈现给视图

总结功能:

我试图将所有内容都保留在一个屏幕上

A (Activity) -> B (Fragment replace) -> C (Fragment replace to type data) -> D (Fragment replace and see last fragment data)

问题/问题

当我尝试用数据显然填充最后一个屏幕时,我的代码崩溃了。当我调试它时,它似乎在这个特定行的 MainActivity 中抛出一个错误

CartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer);

我确实通过我创建的接口正确传递了值,但是在调试过程中,我发现我当前的程序正在尝试将信息填充到同一个容器中,因为它似乎还没有提交将片段替换为将变量分配给正确的 UI。

我正在检查是否能够用 D 替换片段 C,并且只有删除上面的代码行才能做到。

下面的代码

主要的

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

我想问题是你onCartButtonClicked在片段 C 内部调用(片段 C 仍然存在),所以片段 D 尚未创建并占据 C 位置。

尝试onCartButtonClicked通过 aHandler在您的MainActivity

于 2013-11-11T09:11:58.347 回答
0

CartFragmentCode addCartInfoTextFragment = (CartFragmentCode) getSupportFragmentManager().findFragmentById(R.id.maincontainer); findFragmentByIdsholule 行中,您在add将片段添加到容器时用作第二个参数,例如ft.add(R.id.maincontainer, AllMenu);,如果您想获取此片段findFragmentById(AllMenu),则使用与片段关联的标记。R.id.maincontainer是显示该片段的容器。

于 2013-11-11T08:59:29.547 回答
-1

这是我当时模仿解决方案的资源之一(他在一个活动中使用两个片段,而我的应用程序正在尝试使用一个活动并替换主框架布局):http ://www.techotopia.com/ index.php/Using_Fragments_in_Android_-_A_Worked_Example

在使用示例代码并使用可用文档之后。我无法使用这两行来传输 MainActivity 中建议的信息:

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

我想我终于找到了解决方法或解决方案?我不确定这是否是将信息传递给片段或其他类的正确方法,但这里是......

我基本上拿走了这两行并重新编写了我的 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;

然后我把这些值和 setText 放到我的 textViews 中。哇啦!它按预期工作,但是我不确定这是否是正确的做事方式......如果你们能够找到更专业的方式来处理跨多个片段的数据,请告诉我!

于 2013-11-12T05:22:40.253 回答