Метод интерфейса для намерения не работает во фрагменте - PullRequest
0 голосов
/ 26 мая 2020

У меня проблема. Я хочу использовать метод onNewIntent() во фрагменте. К счастью, я получил один действительно хороший ответ ( Пожалуйста, посмотрите ). Я пытался работать с этим фрагментом кода, но, к сожалению, тег NF C не читается. Что я делаю не так? Надеюсь, вы поможете мне с этим вопросом. Буду очень благодарен за каждый ответ. Новый код всегда вставлялся между строками комментариев // NEW INTENT

UserFragmentGeldaufladen

public class UserFragmentGeldaufladen extends Fragment {

        private Button btn_user_geldaufladen, btn_user_main_geldsendenAbort;
        private EditText edittext_user_geldaufladen;
        private Dialog epicDialog;

        private NfcAdapter nfcAdapter;
        private PendingIntent pendingIntent;
        private boolean writeMode;
        private IntentFilter writeTagFilters[];
        private Context context;
        private Tag myTag;

        private interface RetrievalEventListener<T> {
            abstract void onDataRetrieved(T t);
        }



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

            btn_user_geldaufladen = view.findViewById(R.id.btn_user_geldaufladen);
            edittext_user_geldaufladen = view.findViewById(R.id.edittext_user_geldaufladen);
            context = view.getContext();
            epicDialog = new Dialog(view.getContext());




            nfcAdapter = NfcAdapter.getDefaultAdapter(view.getContext());
            if (nfcAdapter == null) {
                // Stop here, we definitely need NFC
                Toast.makeText(view.getContext(), "This device doesn't support NFC.", Toast.LENGTH_LONG).show();
            }



            // NEW INTENT
            Intent i = new Intent(context, UserHomeActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            //i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // -> this will be require, if you will be update your fragment from BroadcastReceiver or Service
            startActivity(i);
            // NEW INTENT


            readFromIntent( getActivity().getIntent());
            pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
            IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
            tagDetected.addCategory(Intent.CATEGORY_DEFAULT);

            btn_user_geldaufladen.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    transaction();


                }
            });





            return view;

        }


        // NEW INTENT


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

            //get first time intent
            Intent intent = getActivity().getIntent();

            ((UserHomeActivity)getActivity()).setOnNewIntentListener(new OnNewIntentListener() {
                @Override
                public void newIntent(Intent intent) {
                    readFromIntent(intent);
                    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
                        myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                    }
                }
            });
        }

        // NEW INTENT


        private void readFromIntent(Intent intent) {
            String action = intent.getAction();
            if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                    || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                    || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
                Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
                NdefMessage[] msgs = null;
                if (rawMsgs != null) {
                    msgs = new NdefMessage[rawMsgs.length];
                    for (int i = 0; i < rawMsgs.length; i++) {
                        msgs[i] = (NdefMessage) rawMsgs[i];
                    }
                }
                buildTagViews(msgs);
            }
        }
        private void buildTagViews(NdefMessage[] msgs) {
            if (msgs == null || msgs.length == 0) return;

            String text = "";
    //        String tagId = new String(msgs[0].getRecords()[0].getType());
            byte[] payload = msgs[0].getRecords()[0].getPayload();
            String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; // Get the Text Encoding
            int languageCodeLength = payload[0] & 0063; // Get the Language Code, e.g. "en"
            // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");

            try {
                // Get the Text
                text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
            } catch (UnsupportedEncodingException e) {
                Log.e("UnsupportedEncoding", e.toString());
            }

            System.out.println(text);
        }


        /***
         * Initiates the transaction
         */
        private void transaction() {

            String amount_geldaufladen = String.valueOf(edittext_user_geldaufladen.getText());

            if(!amount_geldaufladen.isEmpty() && Integer.parseInt(amount_geldaufladen) > 0) {
                showWaitingPopup();
            }
        }

        /***
         * Shows that the user should confirm the payment
         */
        private void showWaitingPopup() {
            epicDialog.setContentView(R.layout.user_main_popup_waiting);
            epicDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            btn_user_main_geldsendenAbort = (Button) epicDialog.findViewById(R.id.btn_user_main_geldsendenAbort);

            btn_user_main_geldsendenAbort.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    firebaseTransaction(new RetrievalEventListener<Integer>() {
                        @Override
                        public void onDataRetrieved(Integer integer) {
                            if(integer == 1) {
                                // do something
                            }

                        }
                    });
                    epicDialog.dismiss();
                }

            });
            epicDialog.show();
        }

        /***
         * Accesses the Firebase database and handles everything
         */
        private void firebaseTransaction(final RetrievalEventListener<Integer> retrievalEventListener) {
            // do Something
            retrievalEventListener.onDataRetrieved(1);
        }

    /*
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            readFromIntent(intent);
            if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
                myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            }
        }
    */


        @Override
        public void onPause(){
            super.onPause();
            WriteModeOff();
        }

        @Override
        public void onResume(){
            super.onResume();
            WriteModeOn();
        }



        /******************************************************************************
         **********************************Enable Write********************************
         ******************************************************************************/
        private void WriteModeOn(){
            writeMode = true;
            nfcAdapter.enableForegroundDispatch((Activity) context, pendingIntent, writeTagFilters, null);
        }
        /******************************************************************************
         **********************************Disable Write*******************************
         ******************************************************************************/
        private void WriteModeOff(){
            writeMode = false;
            nfcAdapter.disableForegroundDispatch((Activity) context);
        }


    }

UserHomeActivity

public class UserHomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, UserOnFragmentBtnSelected {

    Toolbar toolbar;
    DrawerLayout drawer;
    ActionBarDrawerToggle toggle;
    NavigationView navigationView;
    FragmentManager fragmentManager;
    FragmentTransaction fragmentTransaction;
    Fragment fragment;
    String username;


    // NEW INTENT

    private OnNewIntentListener mOnNewIntentListener;

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        if (mOnNewIntentListener != null) {
            mOnNewIntentListener.newIntent(intent);
        }
    }

    public void setOnNewIntentListener(OnNewIntentListener onNewIntentListener) {
        this.mOnNewIntentListener = onNewIntentListener;
    }

    // NEW INTENT

OnNewIntentListener

public interface OnNewIntentListener {
    void newIntent(Intent intent);
}
...