2012-07-17 36 views
5

EDIT: Đã giải quyết. Câu trả lời được đăng riêng bên dướiBàn phím Android vẫn hiển thị sau khi khởi chạy Mục đích email

Tôi đang khởi chạy Intent.ACTION_SEND "trình chọn" để người dùng có thể chọn cách gửi thư từ ứng dụng của tôi. Nó hoạt động OK, nhưng nếu tôi nhấn 'Discard' trong chương trình Email được khởi chạy, nó sẽ trở lại ứng dụng của tôi với bàn phím ảo vẫn hiển thị. Tôi đã cố gắng đóng nó với nhiều câu thần chú của imm.hideSoftInputFromWindow (...) nhưng vô ích. Bất kỳ ý tưởng làm thế nào để sửa lỗi này?

Đây là cách tôi khởi chạy 'trình chọn' và cố gắng đóng bàn phím trong onActivityResult(). Lưu ý rằng tabHost là một thành viên tĩnh trong ứng dụng chính của tôi (MainApp) chứa đối tượng tabHost được sử dụng để tạo tabSpecs.

public class L_Secondary extends ListActivity implements myConst 
{ 
    @Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
    super.onCreate (savedInstanceState); 
    setContentView(R.layout.l_people_secondary); 

    // instantiate the custom array adapter class and pass it some info to build a ListView with. 
    ListView lv = getListView(); 
    lv.setOnItemClickListener (oicl); 
    A_secondary da = new A_secondary (this, android.R.layout.simple_list_item_single_choice, mPiecesArray, mPartsArray); 

    setListAdapter (da); 
    } 

    ... 


    // after launching the email client, the keyboard stays visible 
    // over the Listview. Currently the keyboard gets forced to close 
    // in getView() of the ArrayAdapter class da, in onCreate() above     
    public void launchEmail() 
    { 
    try 
    { 
    // use the builtin chooser for users mail app 
    Intent sendIntent = new Intent(Intent.ACTION_SEND, Uri.fromParts ("mailto", "[email protected]", null)); 
    sendIntent.setType("text/plain");  

    sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "msg_subject"); 
    sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, "msg_body"); 

    startActivityForResult (Intent.createChooser(sendIntent, "Send via which Application?"), 0); 
    } 
    catch (Exception e) 
    { 
    Toast.makeText (this, "No activity was found to handle this action",Toast.LENGTH_SHORT).show(); 
    } 
    } 

... 

} 

Trả lời

0

tôi đã kết thúc bằng cách sử dụng bối cảnh truyền cho getView() trong lớp ArrayAdapter của tôi được khởi tạo trong lớp L_Secondary. Nó không phải là nơi tốt nhất để làm điều này bởi vì mỗi khi danh sách được cuộn, hoặc chạm vào, hoặc di chuyển nó sẽ kiểm tra xem bàn phím có thể nhìn thấy và đóng nó nếu có. Tuy nhiên, đó là một sự khởi đầu. Từ đây tôi có thể thử và tìm một nơi hiệu quả hơn để đặt nó.

@Override 
public View getView (int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    Context ctx = parent.getContext(); 

    if (row == null) 
    { 
     LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); 
     row = inflater.inflate (R.layout.li_secondary, parent, false); 
    } 

    // hide the keyboard when coming back from Email client Intent 
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isActive() == true) 
     imm.hideSoftInputFromWindow (MainApp.tabHost.getCurrentTabView().getApplicationWindowToken(),imm.HIDE_NOT_ALWAYS); 
    ... 
} 
+0

Tại sao tính năng này hoạt động?Tôi cần hiểu để cố gắng sử dụng nó trong tình huống của mình. – Poutrathor

0

Sử dụng mã này trước khi gọi một mục đích của MAIL // ed là EditText

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); 

cho ẩn bàn phím

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

cho chương trình bàn phím

imm.showSoftInput(ed, 0); 

thử điều này mã trên phương pháp onRestart() cũng

HOẶC

bạn có thể thử này cũng

<activity android:name=".YourActivity" 
      android:windowSoftInputMode="stateHidden"></activity> 

Cảm ơn.

+0

tôi sẽ cố gắng này, nhưng tôi không có một EditText trong ListView của tôi. Tôi sẽ thử nghiệm cảm ơn bạn. – wufoo

+0

Tôi đã chỉnh sửa mã của mình để có thêm một trường hợp giải pháp nếu bạn không có bất kỳ văn bản chỉnh sửa nào trong danh sáchTính năng của bạn. Cảm ơn – SALMAN

+0

Cảm ơn bạn. Tôi có tập stateHidden nhưng vẫn không có may mắn. – wufoo

0

Tôi tin rằng bạn có thể gọi phương thức hideSoftInputFromWindow trong onResume()

protected void onResume() 
{ 
    InputMethodManager keyboard = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE); 
    keyboard.hideSoftInputFromWindow(userInput.getWindowToken(), 0); 
} 
+0

Tại sao điều này lại được bình chọn? – Leon

+0

Không chắc chắn nhưng nếu tôi đang làm điều gì sai, xin vui lòng cho tôi biết –

+0

userInput là gì? –

2

Tôi thấy điều này làm việc cho tôi bằng cách thêm vào onResume của tôi()

protected void onResume() 
{ 
    Handler h = new Handler(); 
    h.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     keyboard.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0); 
    } 
    }, 500); 
} 
+0

chỉ có điều mà làm việc ... – peresisUser

+0

Bạn cũng có thể viết điều này trong onActivityResult() thay vì onResume(). –

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