2011-12-30 73 views
2

我使用setVisibility()來隱藏onStart()的一些UI組件,其目的是在某些情況下使它們在onActivityResult()處重新出現。Android setVisibility(View.VISIBLE)不顯示組件

我已經將變量設置爲全局變量,並將其分配給組件onCreate()

代碼,以使組件無形正常工作,如auth_btn.setVisibility(View.INVISIBLE);

然而,在onActivityResult()auth_btn.setVisibility(View.VISIBLE);不會使按鈕出現。 (在評論來自引擎收錄)

代碼:

private Button auth_btn = null; 
private Button newAcc_btn = null; 
private EditText mEdit = null; 

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

    // Set up the window layout 
    setContentView(R.layout.main); 

    //instance of database adapter 
    db = new DBAdapter(this); 

    // Get local Bluetooth adapter 
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

    // If the adapter is null, then Bluetooth is not supported 
    if (mBluetoothAdapter == null) { 
     Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); 
     finish(); 
     return; 
    } 

    auth_btn = (Button) findViewById(R.id.btn_auth); 
    mEdit = (EditText)findViewById(R.id.text_username); 
    newAcc_btn = (Button) findViewById(R.id.btn_newAcc); 

    //read every entry from database 
    db.load(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    // If BT is not on, request that it be enabled. 
    if (!mBluetoothAdapter.isEnabled()) { 
     Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableIntent, REQUEST_ENABLE_BT); 
     // Otherwise, setup the session 
    } else { 
     setupSession(); 
    } 
} 

private void setupSession() { 
    //Authenticate 
    auth_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       out.write(AUTHENTICATE); 
       out.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      authenticate(); 
     } 
    }); 

    //Create new account 
    newAcc_btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      try{ 
       out.write(NEWACCOUNT); 
       out.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      newAccount(); 
     } 
    }); 

    //Scan QR Code 
    Button scan = (Button) findViewById(R.id.btn_scan); 
    scan.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
      intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); 
      startActivityForResult(intent, SCAN_QR_CODE); 
     } 
    }); 

    auth_btn.setVisibility(View.INVISIBLE); 
    newAcc_btn.setVisibility(View.INVISIBLE); 
    mEdit.setVisibility(View.INVISIBLE); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (requestCode == SCAN_QR_CODE) { 
     if (resultCode == RESULT_OK) { 
      //Successful scan 
      processQR(intent.getStringExtra("SCAN_RESULT")); 
      //String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); //format of the code 

      //Toast.makeText(this, contents, Toast.LENGTH_LONG).show(); 
     } else if (resultCode == RESULT_CANCELED) { 
      Toast.makeText(this, "Scan failed!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
    if (requestCode == REQUEST_ENABLE_BT) { 
     // When the request to enable Bluetooth returns 
     if (resultCode == Activity.RESULT_OK) { 
      // Bluetooth is now enabled, so set up a chat session 
      setupSession(); 
     } else { 
      // User did not enable Bluetooth or an error occurred 
      Log.d(TAG, "BT not enabled"); 
      Toast.makeText(this, "Bluetooth cannot be enabled", Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 
    } 

} 

public void processQR (String content) { 
    String[] contents = content.split(" "); 
    if (contents.length != 3) { 
     Log.e(TAG, "Not well formed QR Code"); 
    } 
    else { 
     appKey = contents[APPKEY]; 
     macAdd = contents[MACADR]; 
     my_uuid = UUID.fromString(contents[UUID_STR]); 
     Log.d(TAG, macAdd); 
     String appName = db.getAppName(appKey); 
     Log.d(TAG, appName); 
     if (appName == null) 
      return; 
     Toast.makeText(this, appName, Toast.LENGTH_SHORT).show(); 
     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAdd); 
     try { 
      bt = device.createInsecureRfcommSocketToServiceRecord(my_uuid); 
      bt.connect(); 
      in = bt.getInputStream(); 
      out = bt.getOutputStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.d(TAG, "Set new acc visible"); 
     mEdit = (EditText)findViewById(R.id.text_username); 
     mEdit.setVisibility(View.VISIBLE); 
     newAcc_btn.setVisibility(View.VISIBLE); 

     if (db.appAccounts(appKey).getCount() > 0) 
      auth_btn.setVisibility(View.VISIBLE); 
    } 
} 
+0

也許無效()父視圖? – 2011-12-30 23:20:33

+2

您是否嘗試過調試您接收這些回調的順序?我的意思是,它可能是這樣的情況,你先收到onActivityResult(..),然後將onStart()調用一次後,將你的按鈕放回View.INVISIBLE。 – harism 2011-12-30 23:31:50

+0

@harism yes onActivityResult肯定會晚一些。我已經把一些相關的代碼在這裏pastebin.com/vdheBK5L – segfault 2011-12-30 23:35:20

回答

6

onStart()被稱爲每次活動是可見的。按下scan按鈕後,意圖被執行,然後按鈕被設置爲VISIBLEonActivityResult()

之後,活動再次可見,導致onStart()被執行,因此再次使按鈕INVISIBLE

相關問題