2011-09-08 64 views
42

Tôi muốn số DatePicker của mình và nút này sẽ không hiển thị khi bắt đầu. Và khi tôi ấn nút ma thuật, tôi muốn setVisibility (View.Visible);Android: tại sao setVisibility (View.GONE); hoặc setVisibility (View.INVISIBLE); không hoạt động

Vấn đề ở đây là khi tôi setVisibility(View.GONE) hoặc setVisibility(View.INVISIBLE) không có thay đổi nào và thành phần vẫn hiển thị.

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

Trả lời

86

Tôi thấy có một vài điều sai. Để bắt đầu, bạn không có nút ma thuật được xác định và không có trình xử lý sự kiện cho nó.

Ngoài ra, bạn không nên sử dụng:

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

Chỉ sử dụng một trong hai. Từ Android documentation:

View.GONE Quan điểm này là vô hình, và nó không có bất kỳ không gian cho mục đích bố trí.

Chế độ xem.INVISIBLE Chế độ xem này là ẩn, nhưng vẫn còn chiếm dung lượng cho mục đích bố cục.

Trong ví dụ của bạn, bạn đang ghi đè bài tập View.GONE với số View.INVISIBLE.


Hãy thử thay thế:

final DatePicker dp2 = new DatePicker(this) 

với:

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

Tương tự như vậy cho các widget khác:

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 nói rằng "GONE: Chế độ xem này là vô hình và không chiếm bất kỳ không gian nào cho mục đích bố cục". Và "KHÔNG THỂ KIỂM SOÁT: Chế độ xem này là vô hình, nhưng nó vẫn chiếm không gian cho mục đích bố cục." Sử dụng cái nào khớp với nhu cầu của bạn. – gorlok

-22

Vì bạn đặt hiển thị đúng hoặc sai. hãy thử rằng setVisible(0) để hiển thị đúng. and setVisible(4) để hiển thị sai.

+0

Tôi phải làm như thế nào? – nayden

+0

văn bản có thể ẩn nhưng nút và không có ngày tháng. – nayden

+38

KHÔNG SỬ DỤNG số nguyên nguyên, đó là thói quen xấu, sử dụng View.GONE hoặc View.VISIBLE thay vì ... – Lukap

6

Đầu tiên nhìn thấy mã của bạn:

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

Ở đây bạn đặt cả tầm nhìn đến cùng lĩnh vực vì vậy đó là vấn đề. Tôi đưa ra một mẫu cho số sample demo

+0

ArrayAdapter adapter7 = new ArrayAdapter (Application.getContext(), android.R.layout. simple_spinner_item, tùy chọn()); \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 (AdapterView mới.OnItemSelectedListener() { \t \t \t public void onItemSelected (AdapterView adapterView, Xem xem, int i, dài l) { \t \t \t \t dp2.setVisibility (View.VISIBLE); \t \t \t \t btn2.setVisibility (View.VISIBLE); – nayden

+0

vấn đề là từ đây. Trở thành bên trong của onItemSelect – nayden

+0

Hãy thử Nút btn1 này, btn2; \t \t Quay tròn; \t \t btn1 = (Nút) findViewById (R.id.button1); \t \t spin = (Spinner) findViewById (R.id.spinner1); \t \t Chuỗi [] sample11 = {"Mẫu", "HI"}; \t \t spin = (Spinner) findViewById (R.id.spinner1); \t \t ArrayAdapter bộ chuyển đổi = \t \t \t ArrayAdapter mới (this, \t \t \t \t \t android.R.layout.simple_spinner_item, sample11); \t \t spin.setAdapter (bộ điều hợp); \t \t btn1.setOnClickListener (new OnClickListener() { \t \t \t @ Override \t \t \t public void onClick (View v) { \t \t \t \t // TODO Auto-tạo ra phương pháp sơ khai \t \t \t \t quay .setVisibility (View.GONE); \t \t \t} \t \t}); –

8

Bạn có thể nghĩ nó như là một tầm nhìn màn hình phong cách 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

Xem.GONE Chế độ xem này ẩn và không chiếm bất kỳ không gian nào cho mục đích bố cục.

Chế độ xem.INVISIBLE Chế độ xem này là vô hình nhưng vẫn chiếm không gian cho mục đích bố cục.

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

Hôm nay tôi đã có một kịch bản, nơi tôi đã được thực hiện sau hành động:

myViewGroup.setVisibility(View.GONE); 

chuột phải vào khung tiếp theo tôi đã thực hiện một kiểm tra if ở một nơi khác cho trạng thái hiển thị của quan điểm đó. Và đoán xem? Các điều kiện sau đây được thông qua:

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

Đặt breakpoint bạn thấy, rằng những thay đổi tầm nhìn đến GONE, nhưng ngay vào khung tiếp theo nó một cách kỳ diệu trở thành VISIBLE. Tôi đã cố gắng để hiểu làm thế nào địa ngục này có thể xảy ra.

Hóa ra là có một hình ảnh động áp dụng đối với quan điểm này, mà trong nội bộ gây ra nhằm thay đổi đó là tầm nhìn đến VISIBLE cho đến khi kết thúc hoạt hình:

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

    myViewGroup.setVisibility(View.GONE); 
} 

Nếu bạn gỡ lỗi, bạn sẽ thấy rằng myViewGroup thực sự thay đổi khả năng hiển thị của nó là GONE, nhưng ngay trên khung tiếp theo, nó sẽ lại hiển thị theo thứ tự để hoạt ảnh chạy.

Vì vậy, nếu bạn gặp phải tình huống như vậy, hãy đảm bảo bạn không thực hiện kiểm tra if ở giữa hoạt ảnh chế độ xem.

Bạn có thể xóa tất cả hoạt ảnh trên chế độ xem qua View.clearAnimation().

+0

Đây là câu trả lời cho tôi (View.clearAnimation()). Luôn gọi View.clearAnimation() trên chế độ xem bạn muốn đặt thành GONE khi bạn biết rằng bạn đặt hoạt ảnh trên đó. –

0

Chế độ xem.GONE làm cho chế độ xem ẩn đi mà không có chế độ xem chiếm dung lượng trong bố cục. Chế độ xem.INVISIBLE làm cho chế độ xem chỉ ẩn hình vẫn chiếm không gian. Trước tiên, mã được thực hiện tuần tự, đầu tiên khung nhìn trở thành GONE sau đó nó bị ghi đè bởi loại không thể chấp nhận được vẫn chiếm không gian.

Bạn nên thêm nút nghe trên nút và bên trong phương thức onClick() làm cho các chế độ xem hiển thị. Điều này sẽ là logic theo tôi trong phương thức onCreate() của bạn.

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

Tôi nghĩ điều này sẽ hoạt động dễ dàng. Hi vọng điêu nay co ich.

Các vấn đề liên quan