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()方法之前。如果有人知道告訴我更有效的解決方案,我將不勝感激。