【问题标题】:Use onNewIntent(...) in a fragment在片段中使用 onNewIntent(...)
【发布时间】:2020-09-13 01:47:50
【问题描述】:

我有问题。我想使用onNewIntent(...)getIntent(...) 的方法。 不幸的是,片段不知道这个意图。如何在我的片段中使用此方法? 这个片段应该能够读取 NFC 标签,所以我需要这个意图。 我会很高兴收到答复。我提前谢谢你。下面你可以看到我的代码。

public class UserFragmentGeldaufladen extends Fragment {

    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);


        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();
        }
        // Error
        readFromIntent(getIntent());
        pendingIntent = PendingIntent.getActivity(this, 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);



        return view;

    }


    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);
    }






    // Error
    @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();
    }


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


}

【问题讨论】:

    标签: java android android-studio android-intent nfc


    【解决方案1】:

    您可以将 getIntent() 与 Fragments 一起使用,但您需要先调用 getActivity()。像getActivity().getIntent()... 这样的东西可以工作。

    【讨论】:

    • 感谢您的回答! getActivity().getIntent() 工作。但是我怎么能用这个方法@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); }
    • @FischerKlaus Doc 说:“如果活动在其包中将 launchMode 设置为“singleTop”,或者客户端在调用startActivity(Intent) 时使用了Intent#FLAG_ACTIVITY_SINGLE_TOP 标志,则会调用此方法。”。这是活动方法,而不是片段。
    • @grabarz121 谢谢! :) 可以给我更多信息吗?我不知道该怎么做。
    【解决方案2】:

    我编写了一个示例代码来使onNewIntent 方法工作。
    添加一个接口类来与 UserFragmentGeldaufladen 片段交流您的片段活动

    public interface OnNewIntentListener {
        void newIntent(Intent 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;
    }
    

    现在,在 UserFragmentGeldaufladen 片段中,添加 onCreate 方法。当你的活动第一次开始时,你必须从活动中获得意图,就像 @Dante 说的

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        //get first time intent
        Intent intent = getActivity().getIntent();
    
        ((YourActivity)getActivity()).setOnNewIntentListener(new OnNewIntentListener() {
            @Override
            public void newIntent(Intent intent) {
                //handle your code here for each new intent
            }
        });
    }
    

    要在onNewIntent 方法中接收意图,请更新您的活动调用

    Intent i = new Intent(context, YourActivity.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);
    

    希望对你有所帮助。

    【讨论】:

    • 非常感谢!我很高兴收到你的消息!不幸的是我还有问题。让我们将您的代码分成 4 个块。 1: 加载 UserFragment 2: FragmentAcitvity 3: 加载 UserFragment 4: 加载 UserFragment 代码应该去哪里?再次非常感谢您!
    • 我可以发送或更新我的代码,你会检查我做错了什么吗?提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多