Android在TabHost中以编程方式关闭/隐藏键盘?

时间:2013-01-29 09:32:09

标签: android android-tabhost android-softkeyboard

我目前正在开发Android应用程序,当您第一次加载此应用程序时,它使用TabHost显示应用程序的各种视图(活动)。因此,当它加载时,它有一个视图,用户可以输入一个数字,以便自动显示软键盘。

首先我假设当用户去了应用程序中的其他选项卡时,如果没有EditText字段,键盘会消失,但是键盘保持并从数字键盘切换到标准文本键盘并且是关闭的唯一方法它是通过单击设备上的后退按钮。这不是用户友好的,而不是我想要的,因为当用户切换到键盘应关闭的另一个选项卡时。

我创建了下面的代码,如果键盘当前在屏幕上打开,它应该关闭键盘。

private OnTabChangeListener MyOnTabChangeListener = new OnTabChangeListener(){
        @Override

            public void onTabChanged(String tabId) {
            Log.d("TAG", "I am Inside the Tab Changed Function!!");
                if(getTabHost().getCurrentTabTag().equals("SecondTab")) {
                    Log.d("TAG", "I am Inside the SecondTab Section!!");

                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
                    if(imm != null)
                    { 
                        Log.d("TAG", "I am Inside the SecondTab imm null!!");
                        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 
                    }

                }
                if(getTabHost().getCurrentTabTag().equals("FirstTab")) {
                    Log.d("TAG", "I am Inside the FirstTab Section!!");


                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
                    if(imm != null)
                    { 
                        Log.d("TAG", "I am Inside the FirstTab imm null!!");
                        imm.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT); 
                    } 

                }
            }


    };

上面的代码确实有效,就像我转到第二个标签,键盘在第一个标签上打开它将被关闭,但是如果我然后去说第三个标签然后再回到第二个标签它打开我不想要的键盘,因为我只需要第一个标签上的键盘。

任何人都可以帮我解决这个问题,因为我无法控制软键盘这么难。

提前致谢

编辑...

我甚至尝试在SecondTab点击监听器中使用下面的代码而没有运气:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
                    if(imm != null)
                    { 
                        Log.d("TAG", "I am Inside the SecondTab imm null!!");
                        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); 
                    }

编辑2 .....

我感谢下面的第一个回复但是我已经尝试将其添加到活动本身但由于某种原因它不起作用:SI也尝试了许多不同的事情,没有运气我甚至将以下内容添加到我的清单文件中但是这不是令人费解的工作:s

android:windowSoftInputMode="stateHidden"

那本应该有用但不是真的很烦人。我的清单文件的一部分如下:

 <application
        android:allowBackup="true"
        android:icon="@drawable/logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".TabActivityTop"
            android:label="@string/app_name" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="Tab1" android:screenOrientation="portrait"></activity>
        <activity android:name="Tab2" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden"></activity>
        <activity android:name="Tab3" android:screenOrientation="portrait"></activity>
        <activity android:name="Tab4" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden"></activity>
    </application>

如果有帮助,我还在下面包含了我的完整TabActivityTop.java文件:

import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class TabActivityTop extends TabActivity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TabHost tabHost = getTabHost();

        TabSpec tab1spec = tabHost.newTabSpec("Tab1");
        tab1spec.setIndicator("", getResources().getDrawable(R.drawable.icon_tab1_tab));
        Intent tab1Intent = new Intent(this, tab1.class);
        tab1spec.setContent(tab1Intent);

        TabSpec tab2spec = tabHost.newTabSpec("");
        tab2spec.setIndicator("", getResources().getDrawable(R.drawable.icon_tab2_tab));
        Intent tab2Intent = new Intent(this, tab2.class);
        tab2spec.setContent(tab2Intent);

        TabSpec tab3spec = tabHost.newTabSpec("");
        tab3spec.setIndicator("", getResources().getDrawable(R.drawable.icon_tab3_tab));
        Intent tab3Intent = new Intent(this, tab3.class);
        tab3spec.setContent(tab3Intent);

        TabSpec tab4spec = tabHost.newTabSpec("Tab4");
        tab4spec.setIndicator("", getResources().getDrawable(R.drawable.icon_tab4_tab));
        Intent tab4Intent = new Intent(this, tab4.class);
        tab4spec.setContent(tab4Intent);

        tabHost.setOnTabChangedListener(MyOnTabChangeListener);

        // Adding all TabSpec to TabHost
        tabHost.addTab(tab1);
        tabHost.addTab(tab2);
        tabHost.addTab(tab3);
        tabHost.addTab(tab4);
    }

    private OnTabChangeListener MyOnTabChangeListener = new OnTabChangeListener(){
        @Override

            public void onTabChanged(String tabId) {
            Log.d("TAG", "I am Inside the Tab Changed Function!!");
                if(getTabHost().getCurrentTabTag().equals("contact")) {
                    Log.d("TAG", "I am Inside the Tab4 Section!!");

                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
                    if(imm != null)
                    { 
                        Log.d("TAG", "I am Inside the imm null!!");
                        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); 
                    }

                }
                if(getTabHost().getCurrentTabTag().equals("Tab1")) {
                    Log.d("TAG", "I am Inside the Tab1 Section!!");
                }
            }

    };


}

我真的希望有人可以帮助我:)

1 个答案:

答案 0 :(得分:0)

试试这样:

 InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

或尝试使用:

 rootLayout.requestFocus();