0

我的应用程序由TabHost和的ActivityGroup与它嵌套的活动。当ActivityGroup的Activity创建或恢复时,软键盘立即显示。我需要它只显示我点击EditText。我的ActivityGroup类:软键盘始终显示在活动具有的ActivityGroup和TabHost使用

public class LoginTabGroup extends ActivityGroup { 

private ArrayList<String> mIdList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

/** 
* This is called when a child activity of this one calls its finish method. 
* This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity 
* and starts the previous activity. 
* If the last child activity just called finish(),this activity (the parent), 
* calls finish to finish the entire group. 
*/ 
@Override 
public void finishFromChild(Activity child) { 
LocalActivityManager manager = getLocalActivityManager(); 
int index = mIdList.size()-1; 

if (index < 1) { 
finish(); 
return; 
} 

manager.destroyActivity(mIdList.get(index), true); 
mIdList.remove(index); 
index--; 
String lastId = mIdList.get(index); 
Intent lastIntent = manager.getActivity(lastId).getIntent(); 

Window newWindow = manager.startActivity(lastId, lastIntent); 
newWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
Log.i("ActivityGroup","finishFromChild method"); 
setContentView(newWindow.getDecorView()); 
} 

/** 
* Starts an Activity as a child Activity to this. 
* @param Id Unique identifier of the activity to be started. 
* @param intent The Intent describing the activity to be started. 
* @throws android.content.ActivityNotFoundException. 
*/ 
public void startChildActivity(String Id, Intent intent) 
{ 
    Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
    Log.i("ActivityGroup","startActivity method"); 
    if (window != null) { 
    mIdList.add(Id); 
    setContentView(window.getDecorView()); 
    } 
} 

/** 
* The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR 
* from calling their default KeyEvent.KEYCODE_BACK during onKeyDown. 
*/ 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
    //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
    return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

/** 
* Overrides the default implementation for KeyEvent.KEYCODE_BACK 
* so that all systems call onBackPressed(). 
*/ 
@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
    onBackPressed(); 
    return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

/** 
* If a Child Activity handles KeyEvent.KEYCODE_BACK. 
* Simply override and add this method. 
*/ 
    @Override 
    public void onBackPressed() { 
    int length = mIdList.size(); 
    if (length > 1) { 
    Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 
    current.finish(); 
    } 
} 
} 

我试图做这样的newWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

在新窗口创建,但它并没有帮助。像

InputMethodManager imm = (InputMethodManager)getSystemService(
       Context.INPUT_METHOD_SERVICE); 
    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

在嵌套活动工作正常,但在活动创建或恢复键盘显示,然后立即隐藏。我不认为这是键盘闪烁的理由。我也尝试添加AndroidManifest中的

android:windowSoftInputMode="stateAlwaysHidden" 
     android:configChanges="keyboardHidden|orientation" 

两者都嵌套在Activities,ActivityGroups中。但结果依然如此。我该如何解决这个问题?

回答

0

的ActivityGroup使用实在是太差了,慢的解决方案。我决定在选项卡中使用嵌套Fragments的FragmentActivities。尽管如此,有时软键盘显示活动开始时。我在其中一个没有图像的标签中设置文本到中心。我想,这叫软键盘显示。我的修复程序(在TabActivity类中):

final View view = tabHost.getTabWidget().getChildTabViewAt(1); 
     if (view != null) { 
     // view.getLayoutParams().height *= 0.66; 
      InputMethodManager imm2 = (InputMethodManager)getSystemService(
        Context.INPUT_METHOD_SERVICE); 
      imm2.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 
      // get title text view 
      final View textView = view.findViewById(android.R.id.title); 
      if (textView instanceof TextView) { 
       // just in case check the type 

       // center text 
       ((TextView) textView).setGravity(Gravity.CENTER); 
       // wrap text 
       ((TextView) textView).setSingleLine(false); 
       // explicitly set layout parameters 
       textView.getLayoutParams().height = ViewGroup.LayoutParams.FILL_PARENT; 
       textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; 
      } 
     } 
0

这是因为在你的布局edittexts是可聚焦元素,并要求重点在启动时如果没有其他元素的要求吧。解决方法很简单:在你所有的布局文件设置可聚焦和focusableInTouchMode为true在容器布局,因此它会要求首先关注和编辑文本将不会被聚焦。那么你可以删除你的隐式隐藏)

android:focusable="true" 
android:focusableInTouchMode="true" 
+0

that does''help me .. – 2013-02-28 14:47:11

0

我用hack解决了这个问题。在ActivityGroup的类和子活动中,我把

 InputMethodManager imm = (InputMethodManager)getSystemService(
        Context.INPUT_METHOD_SERVICE); 
     imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

onCreate()和onResume()方法之前。如果有人知道告诉我更有效的解决方案,我将不胜感激。