1

nfcタグを読み書きするためのアプリを作成しています。そのために、4つのタブを持つタブメニューを作成しました。このアプリには、カスタム タイトル バーと背景の画像があります。
このアプリを API 16 で実行しようとしてい
ます。タブ 3 を押すと、カスタム タイトル バー、背景、および下の 4 つのタブがすべて正しく表示されます。このタブ内には、テキストボックスとボタンがあります。ボタンをクリックすると、テキストボックス内のテキストが nfc タグに渡されます。そうでない場合は、タグデータを読み取る必要があります。
何が起こるかというと、タグに書き込む代わりにボタンをクリックすると、タグが読み取られ、タグが読み取られると、開始されるアクティビティはタグアクティビティですが、レイアウトが間違っているため、定義されたアクティビティタイトルのみが表示されますマニフェストでは、黒い背景とテキストボックスとボタン。次に、ボタンをクリックしてタグに書き込むと機能し、ボタンがクリックされていない場合はタグを読み取ります。
ここで、内部にボタンがある 4 番目のタブを作成しました。ボタンをクリックすると、新しいアクティビティが開始され、このタグアクティビティがうまく機能します。このクラスが api13 の後に非推奨になった場合、この問題は api16 での tagsactivity の使用に関連していますか? それとも、私が行方不明になっているのは別のことですか。
ここにタブ2があります

 import android.app.LocalActivityManager;
   import android.content.Intent;
 import android.os.Bundle;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.View.OnKeyListener;
 import android.view.Window;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.TabHost;

 public class Tabs2 extends android.app.TabActivity{
public TabHost tabHost;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.activity_tabs);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mytitle);
        // Get the tabHost
    this.tabHost = getTabHost();


    Button btentrar= (Button) findViewById(R.id.titlebarRefreshBtn);

       btentrar.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                setResult(2);
                finish();
            }
        }); 

    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch the first Activity for the tab (to be reused)
    intent = new Intent().setClass(this, FirstGroup.class);

    // Initialize a TabSpec for the first tab and add it to the TabHost
    spec = tabHost.newTabSpec("Opcções").setIndicator("FirstGroup",
            getResources().getDrawable(R.drawable.settingsicon)) // Replace null with R.drawable.your_icon to set tab icon
                    .setContent(intent);
    tabHost.addTab(spec);

        // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, SecondActivityGroup.class);

    // Initialize a TabSpec for the second tab and add it to the TabHost
    spec = tabHost.newTabSpec("Tags passadas").setIndicator("Tags Passadas",
            getResources().getDrawable(R.drawable.writedocumenticon)) // Replace null with R.drawable.your_icon to set tab icon
                    .setContent(intent);
    tabHost.addTab(spec);

     // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, ThirdActivityGroup.class);

        // Initialize a TabSpec for the second tab and add it to the TabHost
        spec = tabHost.newTabSpec("Read and write").setIndicator("Ler e escrever",
                getResources().getDrawable(R.drawable.checkiconm)) // Replace null with R.drawable.your_icon to set tab icon
                        .setContent(intent);
        tabHost.addTab(spec);


        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, FourthActivityGroup.class);

        // Initialize a TabSpec for the second tab and add it to the TabHost
        spec = tabHost.newTabSpec("Read and write v2").setIndicator("Ler e escrever v2",
                getResources().getDrawable(R.drawable.checkiconm)) // Replace null with R.drawable.your_icon to set tab icon
                        .setContent(intent);
        tabHost.addTab(spec);

    tabHost.setCurrentTab(0);
}
}

これは、アクティビティグループを拡張するサードアクティビティグループです

import java.util.ArrayList;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class ThirdActivityGroup extends ActivityGroup {

    // Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view
public static ThirdActivityGroup group;

    // Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory.
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.history = new ArrayList<View>();
      group = this;

          // Start the root activity withing the group and get its view
      View view = getLocalActivityManager().startActivity("TagsActivity", new
                                         Intent(this,TagsActivity.class)
                                          .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                                        .getDecorView();

          // Replace the view of this ActivityGroup
      replaceView(view);

   }

public void replaceView(View v) {
            // Adds the old one to history
    history.add(v);
            // Changes this Groups View to the new View.
    setContentView(v);
}

public void back() {
    if(history.size() > 0) {
        history.remove(history.size()-1);
        setContentView(history.get(history.size()-1));
    }else {
        finish();
    }
}

public void onBackPressed() {
    ThirdActivityGroup.group.back();
    return;
}

}

ここに 4 番目のアクティビティ グループがあります

import java.util.ArrayList;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
 import android.view.View;

public class FourthActivityGroup extends ActivityGroup {

    // Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view
public static FourthActivityGroup group;

    // Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory.
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.history = new ArrayList<View>();
      group = this;

          // Start the root activity withing the group and get its view
      View view = getLocalActivityManager().startActivity("Teste", new
                                        Intent(this,Teste.class)
                                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                                        .getDecorView();

          // Replace the view of this ActivityGroup
      replaceView(view);

   }

public void replaceView(View v) {
            // Adds the old one to history
    history.add(v);
            // Changes this Groups View to the new View.
    setContentView(v);
}

public void back() {
    if(history.size() > 0) {
        history.remove(history.size()-1);
        setContentView(history.get(history.size()-1));
    }else {
        finish();
    }
}

public void onBackPressed() {
    FourthActivityGroup.group.back();
    return;
}

}

ここにテストがあります

import java.util.ArrayList;

import android.app.Activity;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;

public class Teste extends Activity {

    // Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view

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

        setContentView(R.layout.activity_teste);

        Button btnfc= (Button) findViewById(R.id.button1);

           btnfc.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    startActivity(new Intent(Teste.this, TagsActivity.class));  
                }
            }); 

   }

}

ここにタグアクティビティがあります

public class TagsActivity extends Activity {




private NfcAdapter mNfcAdapter;

private Button mEnableWriteButton;
private EditText mTextField;
private ProgressBar mProgressBar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tags);
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mytitle);
    mTextField = (EditText) findViewById(R.id.text_field);

    mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
    mProgressBar.setVisibility(View.GONE);

    mEnableWriteButton = (Button) findViewById(R.id.enable_write_button);
    mEnableWriteButton.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            setTagWriteReady(!isWriteReady);
            mProgressBar.setVisibility(isWriteReady ? View.VISIBLE : View.GONE);
        }
    });

    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (mNfcAdapter == null) {
        Toast.makeText(this, "Sorry, NFC is not available on this device", Toast.LENGTH_SHORT).show();
        finish();
    }


}

private boolean isWriteReady = false;

/**
 * Enable this activity to write to a tag
 * 
 * @param isWriteReady
 */
public void setTagWriteReady(boolean isWriteReady) {
    this.isWriteReady = isWriteReady;
    if (isWriteReady) {
        IntentFilter[] writeTagFilters = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) };
        mNfcAdapter.enableForegroundDispatch(TagsActivity.this, NfcUtils.getPendingIntent(TagsActivity.this),
                writeTagFilters, null);
    } else {
        // Disable dispatch if not writing tags
        mNfcAdapter.disableForegroundDispatch(TagsActivity.this);
    }
    mProgressBar.setVisibility(isWriteReady ? View.VISIBLE : View.GONE);
}

@Override
public void onNewIntent(Intent intent) {
    // onResume gets called after this to handle the intent
    setIntent(intent);
}

@Override
public void onResume() {
    super.onResume();
    if (isWriteReady && NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {
        processWriteIntent(getIntent());
    } else if (!isWriteReady
            && (NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED
                    .equals(getIntent().getAction()))) {
        processReadIntent(getIntent());
    }
}

private static final String MIME_TYPE = "application/com.smartcom.onetagv4";

/**
 * Write to an NFC tag; reacting to an intent generated from foreground
 * dispatch requesting a write
 * 
 * @param intent
 */
public void processWriteIntent(Intent intent) {
    if (isWriteReady && NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {

        Tag detectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);

        String tagWriteMessage = mTextField.getText().toString();
        byte[] payload = new String(tagWriteMessage).getBytes();

        if (detectedTag != null && NfcUtils.writeTag(
                NfcUtils.createMessage(MIME_TYPE, payload), detectedTag)) {

            Toast.makeText(this, "Wrote '" + tagWriteMessage + "' to a tag!", 
                    Toast.LENGTH_LONG).show();
            setTagWriteReady(false);
        } else {
            Toast.makeText(this, "Write failed. Please try again.", Toast.LENGTH_LONG).show();
        }
    }
}

public void processReadIntent(Intent intent) {
    List<NdefMessage> intentMessages = NfcUtils.getMessagesFromIntent(intent);
    List<String> payloadStrings = new ArrayList<String>(intentMessages.size());

    for (NdefMessage message : intentMessages) {
        for (NdefRecord record : message.getRecords()) {
            byte[] payload = record.getPayload();
            String payloadString = new String(payload);

            if (!TextUtils.isEmpty(payloadString))
                payloadStrings.add(payloadString);
        }
    }

    if (!payloadStrings.isEmpty()) {
        String content =  TextUtils.join(",", payloadStrings);
        Toast.makeText(TagsActivity.this, "Read from tag: " + content,
                Toast.LENGTH_LONG).show();

    }
}



}
4

1 に答える 1

0

リンクされた例を使用して、アプリケーションを再構築します。提案: タブの使用に問題があるため、最初のタスクとしてユーザー インターフェイスを作成します。正しく機能したら、NFC コードを追加します。

于 2012-11-16T11:41:21.743 に答える