使用选项卡菜单在api16上使用tabactivity和tab组启动活动

时间:2012-11-14 01:15:15

标签: android nfc activitygroup

我正在创建一个用于读取和编写nfc标签的应用程序,为此我创建了一个带有4个标签的标签菜单。 这个应用程序有一个自定义标题栏和背景图像 我试图在api 16中运行这个应用程序 当tab3被按下时,一切正常,我的自定义标题栏,我的背景和下面的4个标签。在这个标签里面我有一个文本框和一个按钮,按钮点击文本框中的文本应该传递给nfc标签,如果没有,它应该读取标签数据。
会发生什么事情,当我点击buttom而不是写入标签,它的读取,当它读取标签时,启动的活动是标签活动,但布局错误,它只显示定义的活动标题在清单中,黑色背景和文本框和按钮。然后,如果我点击按钮写入标签,它就可以工作,如果没有点击按钮,则读取标签 现在我已经创建了第四个选项卡,里面有一个按钮,如果单击该按钮,它将启动一个新活动,这个标签活动效果很好。 这个问题与在api13中使用tagactivity有关,当这个类在api13之后被弃用了吗? 或者是我失踪的另一件事 这是tabs2

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

这里是扩展activitygroup

的第三个活动组
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;
}

}

这里是fourthactivitygroup

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

}

这是teste

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

    }
}



}

1 个答案:

答案 0 :(得分:0)

使用linked示例重建您的应用程序。建议:使用选项卡时遇到问题,因此第一个任务是构建用户界面。正确使用后,请添加NFC代码。