【问题标题】:Android tabhost missing when nfc scanned扫描 nfc 时缺少 Android tabhost
【发布时间】:2012-11-13 12:55:25
【问题描述】:

当我扫描我的 NFC 标签时,我的应用程序启动并执行它必须做的事情,但 tabhost 丢失了。 mainactivity.java 是我用 3 个选项卡初始化 tabhost 的地方,下面第一部分代码是我利用 NFC 读取功能的选项卡之一。这是因为pendingintent吗?我真的不知道如何解决它,我是否必须在每个活动布局中实现 3 个选项卡?

我的代码:

package com.example.ponpon;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.PatternMatcher;
import android.preference.Preference;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

@TargetApi(10)
public class CouponManager extends Activity {

        private static final String TAG = "NFCReadTag";
        private NfcAdapter mNfcAdapter;
        private IntentFilter[] mNdefExchangeFilters;
        private PendingIntent mNfcPendingIntent;
        public static final String PREF_FILE_NAME = "PrefFile";

        private int[] images = new int[11];

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.coupon_layout);

            //List of images
            images[0]=R.drawable.cp0;
            images[1]=R.drawable.cp1;
            images[2]=R.drawable.cp2;
            images[3]=R.drawable.cp3;
            images[4]=R.drawable.cp4;
            images[5]=R.drawable.cp5;
            images[6]=R.drawable.cp6;
            images[7]=R.drawable.cp7;
            images[8]=R.drawable.cp8;
            images[9]=R.drawable.cp9;
            images[10]=R.drawable.cp10;

            //Restore preferences 
            SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
            int storedPreference = preferences.getInt("storedInt", 0);

            //Image to use depending on coupon collected
            final ImageView img = (ImageView)findViewById(R.id.imageView1);

            if(storedPreference!=10)
            {
                img.setImageResource(images[storedPreference]);
                img.invalidate();
            }
            else
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setCancelable(false);
                builder.setTitle("Coupon Redemption");
                builder.setMessage("Redeem Your Coupon?");
                builder.setInverseBackgroundForced(true);
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which)
                    {
                        dialog.dismiss();
                        SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
                        SharedPreferences.Editor editor = preferences.edit();
                        editor.putInt("storedInt", 0); // value to store
                        editor.commit();    
                        img.setImageResource(images[0]);
                        img.invalidate();
                    }
                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        img.setImageResource(images[10]);
                        img.invalidate();
                    }
                });
                builder.show();
            }


            //Check and send Intent from NFC tag discovered
            mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

            mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                    /*| Intent.FLAG_ACTIVITY_CLEAR_TOP*/), 0);


            IntentFilter coupontag = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
            coupontag.addDataScheme("http");
            coupontag.addDataAuthority("www.ichatime.com", null);
            coupontag.addDataPath(".*", PatternMatcher.PATTERN_SIMPLE_GLOB);

            mNdefExchangeFilters = new IntentFilter[] { coupontag };

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }

        @Override
        protected void onResume() {
            super.onResume();
            if(mNfcAdapter != null) {
                mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent,
                    mNdefExchangeFilters, null);
            } else {
                Toast.makeText(getApplicationContext(), "Sorry, No NFC Adapter found.", Toast.LENGTH_SHORT).show();
            }


        }

        @Override
        protected void onPause() {
            super.onPause();
            if(mNfcAdapter != null) mNfcAdapter.disableForegroundDispatch(this);
            SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
            int storedPreference = preferences.getInt("storedInt", 0);

            SharedPreferences.Editor editor = preferences.edit();
            editor.putInt("storedInt", storedPreference); // value to store
            editor.commit();    
        }

        @Override
        protected void onStop() {
            super.onStop();

            // We need an Editor object to make preference changes.
              // All objects are from android.context.Context
                SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
                int storedPreference = preferences.getInt("storedInt", 0);

                SharedPreferences.Editor editor = preferences.edit();
                editor.putInt("storedInt", storedPreference); // value to store
                editor.commit();    
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();

            // We need an Editor object to make preference changes.
              // All objects are from android.context.Context
                SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
                int storedPreference = preferences.getInt("storedInt", 0);

                SharedPreferences.Editor editor = preferences.edit();
                editor.putInt("storedInt", storedPreference); // value to store
                editor.commit();    
        }

        @Override
           public void onBackPressed() {
            SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
            int storedPreference = preferences.getInt("storedInt", 0);

            SharedPreferences.Editor editor = preferences.edit();
            editor.putInt("storedInt", storedPreference); // value to store
            editor.commit();    
               super.onBackPressed();
           }

        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);      
            SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
            int storedPreference = preferences.getInt("storedInt", 0);

            if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
                NdefMessage[] messages = null;
                Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
                if (rawMsgs != null) {
                    messages = new NdefMessage[rawMsgs.length];
                    for (int i = 0; i < rawMsgs.length; i++) {
                        messages[i] = (NdefMessage) rawMsgs[i];
                    }
                }
                if(messages[0] != null) {
                    String result="";
                    byte[] payload = messages[0].getRecords()[0].getPayload();
                    // this assumes that we get back am SOH followed by host/code
                    for (int b = 1; b<payload.length; b++) { // skip SOH
                        result += (char) payload[b];
                    }
                    if (result.contains("ichatime.com"))
                        {
                        final ImageView img = (ImageView)findViewById(R.id.imageView1);


                        /*if (storedPreference!=10)
                        {
                            Toast.makeText(getApplicationContext(), "Coupon collected!", Toast.LENGTH_SHORT).show();
                            storedPreference++;
                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putInt("storedInt", storedPreference);
                            img.setImageResource(images[storedPreference]);
                            img.invalidate();
                        }*/
                            if (storedPreference==10)
                            {
                                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                                builder.setCancelable(false);
                                builder.setTitle("Redeem Your Coupon?");
                                builder.setInverseBackgroundForced(true);
                                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which)
                                    {
                                        dialog.dismiss();
                                        SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
                                        SharedPreferences.Editor editor = preferences.edit();
                                        editor.putInt("storedInt", 0); // value to store
                                        editor.commit();    
                                        img.setImageResource(images[0]);
                                        img.invalidate();
                                    }
                                });
                                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                        img.setImageResource(images[10]);
                                        img.invalidate();
                                    }
                                });
                                builder.show();
                            }
                        else
                        {
                            Toast.makeText(getApplicationContext(), "Coupon collected!", Toast.LENGTH_SHORT).show();
                            storedPreference++;
                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putInt("storedInt", storedPreference);
                            editor.commit();
                            img.setImageResource(images[storedPreference]);
                            img.invalidate();
                        }}
                    else 
                    {
                        Toast.makeText(getApplicationContext(), "Wrong tag detected!", Toast.LENGTH_SHORT).show();
                    }
                    //Debugging Mode to see what is contained in the tags.
            //          Toast.makeText(getApplicationContext(), "Tag Contains " + result, Toast.LENGTH_SHORT).show();
                }
            }
        }

    }

还有我的主要活动:

package com.example.ponpon;

import android.os.Bundle;
import android.app.TabActivity;
import android.content.Intent;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;

public class MainActivity extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TabHost tabHost = getTabHost();

        TabSpec spec1=tabHost.newTabSpec("Coupon Manager");
        spec1.setContent(R.id.tab1);
        spec1.setIndicator("Coupons");
        Intent CouponsIntent = new Intent(this, CouponManager.class);
        spec1.setContent(CouponsIntent);

        TabSpec spec2=tabHost.newTabSpec("Help");
        spec2.setIndicator("Help");
        spec2.setContent(R.id.tab2);
        Intent SettingsIntent = new Intent(this, Settings.class);
        spec2.setContent(SettingsIntent);

        TabSpec spec3=tabHost.newTabSpec("Write[Vendor]");
        spec3.setIndicator("Write\n[Vendor]");
        spec3.setContent(R.id.tab3);
        Intent HelpIntent = new Intent(this, HelpActivity.class);
        spec3.setContent(HelpIntent);

        tabHost.addTab(spec1);
        tabHost.addTab(spec2);
        tabHost.addTab(spec3);
        }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

【问题讨论】:

    标签: java android image dynamic nfc


    【解决方案1】:

    仔细看看你的逻辑:你有

    if (storedPreference!=10) {
        ...stuff... (including storedPreference++)
    }
    if (storedPreference==10) {
        ...stuff...
    } else {
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("storedInt", 10);
        img.setImageResource(images[10]);
        img.invalidate();
    }
    

    您应该考虑将else 块的内容替换为storedPreference!=10 块,然后删除第一个块。您只需要if storedPreference==10else

    【讨论】:

    • 我会试试的,谢谢!还有一件事,当我用手机扫描 NFC 标签时,我的标签主机不见了(使用标签),我不得不求助于按手机上的后退按钮。这将导致我收集的优惠券归零。我在这里做错了吗?
    • 谢谢!我已经解决了图像未被处理的问题。现在我需要解决显示历史记录的后退按钮,并且当收集的优惠券最大化时,对话框不显示并且onRestart,它显示返回0个优惠券收集但是当扫描标签时,没有收集优惠券。我猜涉及到 storedPreference==10 的代码有问题
    • 很高兴有帮助。那些其他的事情对你来说仍然是个问题吗?如果是这样,请随时发布另一个问题。我没有在代码中看到对您的标签的任何引用。
    • 选项卡在我的 mainactivity.java 中。它包含tabhost,没有别的。我有 3 个选项卡,每个选项卡都是另一个活动。扫描 NFC 时,tabhosts 是否会消失,因为未决意图是仅在其他活动之上启动此活动,从而使其显示为全屏。 (主要活动被忽略)如果是,有解决方法吗?
    • 我用包含 tabhosts 的 mainactivity 更新了我的问题。当我扫描 nfc 标签时,关于如何防止 tabhost 丢失的任何想法?谢谢!
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多