2011-12-30 3 views
2

Я использую setVisibility(), чтобы скрыть некоторые компоненты пользовательского интерфейса на onStart(), с целью их повторного появления при определенных условиях на onActivityResult().Android setVisibility (View.VISIBLE) не отображает компонент

Я установил переменные как глобальную переменную и присвоен компоненту на onCreate().

код, чтобы сделать компонент невидимым правильно работает, например, auth_btn.setVisibility(View.INVISIBLE);

Однако в onActivityResult(), auth_btn.setVisibility(View.VISIBLE); не делает кнопку снова.

код (от Pastebin в комментариях):

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

Возможно, invalidate() родительский вид? –

+2

Вы пробовали отладить заказ, в котором вы получаете эти обратные вызовы? Я имею в виду, что это может быть так, что вы сначала получите onActivityResult (..) и сразу после этого вернете свои кнопки обратно в View.INVISIBLE, как только вызывается onStart(). – harism

+0

@harism yes onActivityResult определенно приходит позже. Здесь я приведу некоторый соответствующий код. Pastebin.com/vdheBK5L – segfault

ответ

6

onStart() называется каждый раз, когда активность видна. После нажатия кнопки scan выполняется намерение, затем кнопки установлены на VISIBLE по адресу onActivityResult().

После этого активность видна снова, в результате чего выполняется onStart(), поэтому снова создаются кнопки INVISIBLE.

Смежные вопросы