0

我目前正在开发一个 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!!");
                }
            }

    };


}

我真的希望有人可以帮我解决这个问题:)

4

1 回答 1

0

试试这样:

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

或尝试使用:

 rootLayout.requestFocus();
于 2013-01-29T09:43:18.737 回答