【问题标题】:Best way to get fragment data from activity [duplicate]从活动中获取片段数据的最佳方法[重复]
【发布时间】:2020-01-22 04:51:28
【问题描述】:

我的应用程序有一个 Main Activity 和 13 个 Fragment。有一个 FragmentAdapter 可以在单击下一个或上一个按钮时更改片段。所有 13 个片段都有用户交互的不同组件。在最后一个片段中,有一个按钮,通过按下该按钮,所有输入的数据都应该传递给父活动(MainActvity)。传递数据后,在活动中做一些工作。所以我想知道实现这一要求的最佳方法。 这是我设置片段适配器的主要活动。

public class HomeActivity extends AppCompatActivity {
private StepperLayout mStepperLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    mStepperLayout = findViewById(R.id.stepperLayout);
    mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager(), this));
}
}

这是 FragmentAdapter。

public class MyStepperAdapter extends AbstractFragmentStepAdapter {


public MyStepperAdapter(FragmentManager fm, Context context) {
    super(fm, context);
}

@Override
public Step createStep(int position) {
        switch (position) {
            case 0:
                final VehicleInformation step1 = new VehicleInformation();
                return step1;
            case 1:
                final DriverHelperDetails step2 = new DriverHelperDetails();
                return step2;
            case 2:
                final LegalDocument step3 = new LegalDocument();
                return step3;
            case 3:
                final LightCondition step4 = new LightCondition();
                return step4;
            case 4:
                final TyreCondition step5 = new TyreCondition();
                return step5;
            case 5:
                final VehicleCabinCondition step6 = new VehicleCabinCondition();
                return step6;
            case 6:
                final OtherConditions step7 = new OtherConditions();
                return step7;
            case 7:
                final TankerCondition step8 = new TankerCondition();
                return step8;
            case 8:
                final CompressorCondition step9 = new CompressorCondition();
                return step9;
            case 9:
                final OtherEquipCondition step10 = new OtherEquipCondition();
                return step10;
            case 10:
                final EmergencyTEquip step11 = new EmergencyTEquip();
                return step11;
            case 11:
                final PersonalProtectEquip step12 = new PersonalProtectEquip();
                return step12;
            case 12:
                final Complete step13 = new Complete();
                return step13;
        }

    return null;
}

这是一个示例片段。

public class VehicleInformation extends Fragment implements BlockingStep {
Button btn_next;
TextInputEditText vname;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.vehicleinformation, container, false);

    vname = rootView.findViewById(R.id.v_no);

    return rootView;
}


@Nullable
@Override
public VerificationError verifyStep() {
    return null;
}

@Override
public void onSelected() {

}

@Override
public void onError(@NonNull VerificationError error) {

}

@Override
@UiThread
public void onNextClicked(StepperLayout.OnNextClickedCallback callback) {
    callback.goToNextStep();
}

@Override
@UiThread
public void onCompleteClicked(final StepperLayout.OnCompleteClickedCallback callback) {
}

@Override
@UiThread
public void onBackClicked(StepperLayout.OnBackClickedCallback callback) {
    callback.goToPrevStep();
}

}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您可以使用接口传递数据。

    Fragment 中创建一个interface,如下所示。

    public class YourFinalFragment extends Fragment {
    
      public interface onSomeEventListener {
        public void someEvent(String s);
      }
    
      onSomeEventListener someEventListener;
    
      @Override
      public void onAttach(Activity activity) {
        super.onAttach(activity);
            try {
              someEventListener = (onSomeEventListener) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString() + " must implement onSomeEventListener");
            }
      }
    .............
    button.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        someEventListener.someEvent("Test text to Fragment1");
      }
    });
    

    在您的activity 中,您必须像下面那样实现interface

    public class MainActivity extends Activity implements onSomeEventListener{
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           .........
        }
    
      @Override
      public void someEvent(String s) {
          // here you can get your desired value sent from fragment
      }
    }
    

    【讨论】:

    • 非常感谢您帮助我。当片段对用户不可见但其中包含数据时,此方法是否有效?我的意思是当我按下最终片段上的按钮时,所有输入的数据都需要传输到父活动。
    • 表示这是一个结合碎片设计的巫师形态。因此,当用户在最后一个片段中时,所有先前的片段都被隐藏了。只有最后一个片段对用户可见。但是以前的片段有数据。我的意思是那种东西
    • 根据你的说法,假设你有fragmentAfragmentBfragmentFinal。现在您必须将数据从一个片段传递到另一个片段(fragmentA=>fragmentB=>fragmentFinal),当您在最终片段中时,您可以按照我的回答将所有数据传递给您的活动。
    • 哦,我明白了。无论如何都可以在不从片段 A 发送到 B 到最终的情况下获取数据吗?一次获取所有内容并从最终片段发送到活动?
    • 是的。您可以将数据保存到shared preference。并且您可以在需要的地方获取它。[注意:使用此数据完成任务后,您必须清除您的preferences]。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2016-08-12
    • 2011-10-27
    • 2020-10-05
    • 2021-12-18
    相关资源
    最近更新 更多