2012-11-14 209 views
1

IM創造閱讀的應用程序,並寫NFC標籤,對於我創建了一個選項卡菜單中,有4個選項卡開始活動。 這個應用程序有一個自定義標題欄,並在背景上的圖像。
我嘗試以API 16
TAB3時按下一切運行這個應用程序顯示正確,我的自定義標題欄,我的背景和下面的4個選項卡。在這個選項卡里面我有一個文本框和一個按鈕,在按鈕上點擊文本框中的文本應該傳遞給nfc標籤,如果沒有,它應該讀取標籤數據。
發生的情況是,當我點擊buttom而不是寫入標籤,讀取標籤時,以及讀取標籤時,啓動的活動是標籤活動,但佈局錯誤,它只顯示活動在清單中定義的標題,黑底,文本框和按鈕。那麼如果我點擊按鈕寫入標籤,它將起作用,並且如果按鈕沒有被點擊則讀取標籤。
現在我創建了第四個標籤,裏面有一個按鈕,如果點擊了按鈕,它會啓動一個新的活動,並且這個標籤活動效果很好。 與api16中使用標籤活動有關的問題,當這個類在api13之後被棄用? 或者是一個即時消息丟失的另一件事。
這裏是TABS2選項卡菜單中使用tabactivity和選項卡組上api16

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

這裏是thirdactivitygroup延伸的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; 
} 

} 

這裏是阿泰斯特

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

    } 

}

這裏是tagsactivity

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

    } 
} 



} 
+0

請清理你的問題,有很多不必要的信息。爲什麼你認爲它失敗了,你可以在代碼失敗的時候粘貼一份日誌的副本嗎? –

+0

@ile im對不起,但我不能在eclipse上運行這個nfc應用程序,因爲它告訴我這個設備不支持nfc.it的作品,但不是我想要的方式。 「run app on eclipse」中的 –

+0

是否意味着您無法在Android虛擬設備上運行它?我很困惑,你能否更清楚地解釋你遇到的具體問題是什麼? –

回答

0

使用linked例子來重新構建應用程序。建議:您在使用選項卡時遇到問題,因此第一項任務將構建用戶界面。當它正確工​​作時,添加您的NFC代碼。

+0

嗨,感謝您的幫助,讓我們嘗試這種方式,您有一個按鈕,即onclick startactivity蘋果,當這個活動是午餐時,在我的情況下,它只出現文字,而不是標籤,即佈局應該出現標籤和文字,但不是。 –