У меня проблема. Я хочу использовать метод 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);
}