方形收据付款签名时,片段的父活动为空

时间:2018-01-29 18:21:37

标签: java android android-fragments android-intent square

我有一个 MasterActivity ,它有一些片段。一个片段允许用户打开Square付费。 用户在Square中签名并且数据返回到我的应用程序后,我的应用程序崩溃,因为付款片段无法找到 MasterActivity ,因为它为null。 / p>

仅在用户签署收据时才会发生。如果用户支付现金(无签名),我的应用程序可以正常工作。

我注意到,当Square App准备签名时它会旋转屏幕,就在签名捕获活动可以查看之前,我可以看到我的应用程序也旋转了。

Square应用程序返回我的应用程序后,我可以看到从我的应用程序成功将数据上传到我的服务器。然后,只有当付款片段要求 MasterActivity 刷新数据时,我才会在 MasterAcitvity DISP_KEY 的null pointer exception >。

可以看到我可能做错了吗?

MasterActivity

public class MasterActivity extends AppCompatActivity  {

    private String TAG = getClass().getSimpleName();
    private String DISP_KEY = "";

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

        Intent intent = getIntent();
        DISP_KEY = (String) intent.getSerializableExtra("SELECTED_DISPATCH");

        initView();
        refreshData();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }


    public void refreshData() {
     //Do some network download data stuff using the DISP_KEY

    }

    private void initView() {

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        //JUST TEXT
        tabLayout.addTab(tabLayout.newTab().setText("Details"));
        tabLayout.addTab(tabLayout.newTab().setText("Sections"));
        tabLayout.addTab(tabLayout.newTab().setText("Area"));
        tabLayout.addTab(tabLayout.newTab().setText("Notes"));
        tabLayout.addTab(tabLayout.newTab().setText("Payments"));

        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);

    }

}

PaymentFragment

public class PaymentFragment extends Fragment  {

    private static final int SQUARE_CHARGE_REQUEST_CODE = 1;

    private String TAG = getClass().getSimpleName();

    private PosClient posClient;

    public PaymentFragment() {
        // Required empty public constructor for fragments
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_payment, container, false);

        initGUI(view);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        mVehicle = ((MasterActivity) this.getActivity()).getCurrentVehicle();
        if (mVehicle != null) {
            reloadData();
        }

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (this != null) {
            ((MasterActivity) context).registerDataReloadListener(this);
            posClient = PosSdk.createClient(getActivity(), AppConfig.SQUARE_APP_ID);
        } else {
            ((MasterActivity) context).onBackPressed();
        }

    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (this != null) {
            ((MasterActivity) getActivity()).unregisterDataReloadListener(this);
        }

    }

    public void reloadData() {
       //Ask the master activity to reload data
    }

     // SQUARE

    private void acceptSquarePayment() {
        ChargeRequest.TenderType types;
        ChargeRequest request = new ChargeRequest.Builder(Integer.parseInt(square_balance), CurrencyCode.USD)
                .enforceBusinessLocation(square_location_id)
                .restrictTendersTo(types)
                .requestMetadata(square_call_num)
                .autoReturn(3200, TimeUnit.MILLISECONDS)
                .build();

            Intent intent = posClient.createChargeIntent(request);
            startActivityForResult(intent, SQUARE_CHARGE_REQUEST_CODE);

    }

     // GET SQAURE RESULTS
 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
                ChargeRequest.Success success = posClient.parseChargeSuccess(data);
                sendReceiptToAPIServer(success.serverTransactionId, success.clientTransactionId, success.requestMetadata);
            } 

    }

    private void sendReceiptToAPIServer(String serverTransactionId, String clientTransactionId, String callNum) {
        //Do some data upload stuff

        //After the successufull upload, this is where the crash happens

        reloadData();
    }


     @Override
    public void onDataReload() {
        mVehicle = ((MasterActivity) this.getActivity()).getCurrentVehicle();

        if (getView() != null) {
            reloadData();
        }
    }
}

0 个答案:

没有答案