6

Tôi gặp sự cố với bàn phím ảo. Tôi có hoạt động với một số EditText hiển thị bàn phím và nút để chuyển đến hoạt động thứ hai. Hoạt động thứ hai hiển thị số ProgressDialog trên số onCreate(), thực hiện công cụ và loại bỏ ProgressDialog. Vấn đề là trong khi ProgressDialog được hiển thị, vậy bàn phím cũng vậy.Ẩn bàn phím sau khi gọi Hoạt động mới hiển thị ProgressDialog

Tôi muốn bàn phím biến mất trước khi tạo ProgressDialog. Tôi tìm kiếm thorougly cả StackOverflow và các trang web khác, nhưng không có gì có vẻ làm việc với kịch bản cụ thể này.

Tôi gắn hai bức ảnh để bạn tham khảo:

http://i45.tinypic.com/2rzq7b6.pnghttp://i45.tinypic.com/34ret1z.png

Đây là mã của hoạt động đầu tiên:

public class FirstActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
       startActivity(intent); 
      } 
     }); 
    } 
} 

và đây là mã của hoạt động thứ hai:

public class SecondActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.second); 

     // TODO: hide keyboard here 

     final ProgressDialog dialog = ProgressDialog.show(this, "", "Please wait...", true, false, null); 

     // in real code, here there is an AsyncTask doing stuff... 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       dialog.dismiss(); 
      } 
     }, 5000); 
    } 
} 

Cảm ơn

+0

Hãy xem này: http://stackoverflow.com/a/3858873/1321873 – Rajesh

+0

@Rajesh, đã cố gắng , không áp dụng ở đây. Hoạt động thứ hai phải ẩn bàn phím, ngay cả khi bàn phím được hiển thị bởi một hoạt động khác. – Venator85

Trả lời

20

Giải Quyết sử dụng một biến thể của kỹ thuật đăng bởi phalt:

InputMethodManager im = (InputMethodManager) this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

Mã này hoạt động một cách chính xác trong onCreate/onStart/onResume, vì không dựa trên một cái nhìn tập trung để có mã thông báo cửa sổ từ.

+2

Điều này không hiệu quả đối với tôi. Đặt nó vào onCreate. –

10

Viết mã này trong tệp manifest.xml cho Hoạt động 'SecondActivity'.

<activity name="EditContactActivity" 
    android:windowSoftInputMode="stateAlwaysHidden"> 
    ... 
</activity> 
+0

Đây không phải là một lựa chọn khả thi đối với tôi, vì bố cục của hoạt động thứ hai có thể bao gồm EditText (được xác định bởi kết quả của AsyncTask). – Venator85

+1

Tôi thấy điều này hữu ích, vì vậy bàn phím sẽ bật lên khi cần thiết, nhưng không tự động tải lên màn hình: android: windowSoftInputMode = "stateHidden" –

+0

cần stateAlwaysHidden | adjustNothing không chỉ stateAlwaysHidden – Odaym

1

bạn có thể sử dụng như cũng này:

InputMethodManager imm;

Viết dưới dòng trong onCreate() Phương pháp:

imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);

Và dòng này là trong onclick nút:

imm.hideSoftInputFromWindow (arg0.getWindowToken(), 0);

Ví dụ:

public class FirstActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 

      imm.hideSoftInputFromWindow(arg0.getWindowToken(), 0); 
      Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 
} 
+0

Điều này hoạt động bình thường, nhưng hoạt động thứ hai nằm trong một dự án thư viện, trong khi hoạt động đầu tiên là trong một dự án khác sử dụng dự án thư viện này. Vì vậy, vì tôi không kiểm soát được hoạt động đầu tiên, hoạt động thứ hai phải trực tiếp xử lý việc ẩn bàn phím. – Venator85

-1

Các bạn đã thử:

InputMethodManager im = (InputMethodManager) 
this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); 

im.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 
InputManagerMethod.HIDE_NOT_ALWAYS); 

Đây là mã tôi ném vào tại các điểm tôi muốn để ẩn bàn phím.

+0

Trục trặc ứng dụng với một NullPointerException vì trong onCreate (rõ ràng sau khi setContentView), onStart và onResume chưa có khung nhìn tập trung nào. – Venator85

+0

OK, thay vào đó, bạn đã cố gắng đặt bàn phím là ẩn trong tệp kê khai hoạt động và sau đó cho phép được hiển thị sau khi mật khẩu qua mã? Chỉnh sửa: ví dụ: trả lời của Krishna Suthar bên dưới và sau đó đảo ngược mã của tôi để bàn phím _can_ được sử dụng. – phalt

+0

Điều này sẽ ném ngoại lệ con trỏ null bởi vì nó sẽ cố gắng để có được tập trung hiện tại và nó sẽ không nhận được một. Thử chạy tập lệnh khỉ trên mã của bạn. Tại một thời điểm, nó có thể cung cấp cho bạn con trỏ null. –

0

Nếu Trong Fragment Lớp

@Override 
    public void onResume() 
    { 
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
     super.onResume(); 
     } 

Nếu Trong Hoạt động Lớp

@Override 
    public void onResume() 
    { 
     this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
     super.onResume(); 
     FetchLocation fl = new FetchLocation(mContext, locationResult); 
    } 
+1

nó hoạt động tốt nhất cho tôi .... – swetha

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