2011-09-08 159 views
42

我想我DatePicker和按鈕,在開始時不可見。當我按下我的魔法按鈕時,我想setVisibility(View.Visible);Android:爲什麼setVisibility(View.GONE);或setVisibility(View.INVISIBLE);不工作

這裏的問題是當我setVisibility(View.GONE)setVisibility(View.INVISIBLE)沒有任何變化,組件仍然可見。

final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2); 
final Button btn2 = (Button) findViewById(R.id.btnDate2); 

dp2.setVisibility(View.GONE); 
dp2.setVisibility(View.INVISIBLE); 
btn2.setVisibility(View.GONE); 
btn2.setVisibility(View.INVISIBLE); 

btn2.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View arg0) { 
     TextView txt2 = (TextView) findViewById(R.id.txt2); 
     txt2.setText("You selected " + dp2.getDayOfMonth() 
      + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear()); 
    } 
}); 

回答

86

我看到了很多不對的地方。對於初學者,你沒有定義你的魔法按鈕,並且沒有事件處理器。

而且你不應該使用:只有

dp2.setVisibility(View.GONE); 
dp2.setVisibility(View.INVISIBLE); 

使用兩個中的一個。從Android documentation

View.GONE這種觀點是不可見的,並且它不採取任何空間佈局 目的。

View.INVISIBLE該視圖是不可見的,但仍然爲 佔用了空間用於佈局目的。

在您的示例中,您將覆蓋作業,其中View.INVISIBLE之一。


嘗試更換:

final DatePicker dp2 = new DatePicker(this) 

有:

DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2); 

同樣,對於其他部件:

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

     LinearLayout ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 

     final DatePicker dp2 = new DatePicker(this); 
     final Button btn2 = new Button(this); 
     final Button magicButton = new Button(this); 
     final TextView txt2 = new TextView(TestActivity.this); 

     dp2.setVisibility(View.GONE); 
     btn2.setVisibility(View.GONE); 
     btn2.setText("set Date"); 

     btn2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       txt2.setText("You selected " 
        + dp2.getDayOfMonth() + "/" + (dp2.getMonth() + 1) 
        + "/" + dp2.getYear()); 
      } 
     }); 

     magicButton.setText("Magic Button"); 
     magicButton.setOnClickListener(new View.OnClickListener()  
      public void onClick(View arg0) { 
       dp2.setVisibility(View.VISIBLE); 
       btn2.setVisibility(View.VISIBLE); 
      } 
     }); 

    ll.addView(dp2); 
    ll.addView(btn2); 
    ll.addView(magicButton); 
    ll.addView(txt2); 

    setContentView(ll); 
} 
+3

API說「GONE:這個視圖是不可見的,它不需要任何空間來佈局」。而「不可見:這個觀點是無形的,但它仍然佔用空間佈局的目的。」使用哪一個符合您的需求。 – gorlok

-22

因爲您將可見性設置爲true或false。 嘗試 setVisible(0)可見真。 and setVisible(4)可見虛假。

+0

我該怎麼做? – nayden

+0

文本可以隱藏,但按鈕和日期選擇器不可見。 – nayden

+38

不要使用文字整數,這是壞習慣,使用View.GONE或View.VISIBLE來代替... – Lukap

6

首先看到你的代碼:

dp2.setVisibility(View.GONE); 
dp2.setVisibility(View.INVISIBLE); 
btn2.setVisibility(View.GONE); 
btn2.setVisibility(View.INVISIBLE); 

這裏同時設置了能見度同一字段,以便這就是問題所在。 我給出了一個樣本sample demo

+0

ArrayAdapter adapter7 = new ArrayAdapter (Application.getContext(),android.R.layout。 simple_spinner_item,options()); \t \t Spinner spinnerEnd =(Spinner)findViewById(R.id.spinnerEnd); adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); \t \t spinnerEnd.setAdapter(adapter7); \t \t spinnerEnd.setOnItemSelectedListener(new AdapterView。OnItemSelectedListener(){ \t \t \t公共無效onItemSelected(適配器視圖適配器視圖,視圖視圖,INT I,長L){ \t \t \t \t dp2.setVisibility(View.VISIBLE); \t \t \t \t btn2.setVisibility(View.VISIBLE); – nayden

+0

問題出在這裏。 Becouse進入onItemSelect – nayden

+0

試試這個按鈕btn1,btn2; \t \t Spinner spin; \t \t btn1 =(Button)findViewById(R.id.button1); \t \t spin =(Spinner)findViewById(R.id.spinner1); \t \t String [] sample11 = {「Sample」,「HI」}; \t \t spin =(Spinner)findViewById(R.id.spinner1); \t \t ArrayAdapter 適配器= \t \t \t新ArrayAdapter (此, \t \t \t \t \t android.R.layout.simple_spinner_item,sample11); \t \t spin.setAdapter(adapter); \t \t btn1.setOnClickListener(新OnClickListener(){ \t \t \t @Override \t \t \t公共無效的onClick(視圖v){ \t \t \t \t // TODO自動生成方法存根 \t \t \t \t旋.setVisibility(View.GONE); \t \t \t} \t \t}); –

8

你可以把它作爲一個CSS樣式知名度&顯示。

<div style="visibility:visible; display:block"> 
    This is View.VISIBLE : Content is displayed normally. 
</div> 

<div style="visibility:hidden; display:block"> 
    This is View.INVISIBLE : Content is not displayed, but div still takes up place, but empty. 
</div> 

<div style="display:none"> 
    This is View.GONE : Container div is not shown, you can say the content is not displayed. 
</div> 
1

View.GONE此視圖是不可見的,它不需要任何空間用於佈局目的。

View.INVISIBLE該視圖是不可見的,但仍佔用空間用於佈局目的。

dp2.setVisibility(View.GONE); 
dp2.setVisibility(View.INVISIBLE); 
btn2.setVisibility(View.GONE); 
btn2.setVisibility(View.INVISIBLE); 
1

今天,我有一個場景,我在那裏執行以下操作:在下一幀

myViewGroup.setVisibility(View.GONE); 

右鍵我在其他地方執行if檢查該視圖的可見性狀態。你猜怎麼着?下面的條件是路過:

if(myViewGroup.getVisibility() == View.VISIBLE) { 
    // this if check was fulfilled magically 
} 

設置斷點你看,能見度變化GONE,但右側的下一個幀上奇蹟般地變成VISIBLE。我試圖瞭解這可能會發生。

原來有適用於這種觀點,在內部造成改變它的知名度VISIBLE,直到完成動畫視圖動畫:

public void someFunction() { 
    ... 
    TransitionManager.beginDelayedTransition(myViewGroup); 
    ... 

    myViewGroup.setVisibility(View.GONE); 
} 

如果調試,你會看到myViewGroup確實改變它的可見性爲GONE,但是在下一幀上,它將再次變爲可見,以便動畫運行。

因此,如果您遇到這種情況,請確保您在動畫視圖中間沒有執行if檢查。

您可以通過View.clearAnimation()刪除視圖上的所有動畫。

+0

這是我的答案(View.clearAnimation())。當您知道您在其上設置了動畫時,始終在您想要設置爲GONE的視圖上調用View.clearAnimation()。 –

0

View.GONE使視圖在不佔用佈局空間的情況下不可見。 View.INVISIBLE使視圖不可見仍佔用空間。

您首先在同一視圖上使用了GONE,然後是INVISIBLE。因爲代碼是按順序執行的,所以首先視圖變爲GONE,然後被INVISIBLE類型佔用的空間重寫。

您應該在按鈕上添加按鈕偵聽器,並在onClick()方法內部使視圖可見。這應該是我的onCreate()方法中的邏輯。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_setting); 

    final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2); 
    final Button btn2 = (Button) findViewById(R.id.btnDate2); 

    dp2.setVisibility(View.INVISIBLE); 
    btn2.setVisibility(View.INVISIBLE); 

    bt2.setOnClickListener(new View.OnCLickListener(){ 
    @Override 
    public void onClick(View view) 
    { 
     dp2.setVisibility(View.VISIBLE); 
     bt2.setVisibility(View.VISIBLE); 
    } 
    }); 
} 

我認爲這應該很容易。希望這可以幫助。

相關問題