0

My application consists of TabHost and ActivityGroup with nested Activities in it. When Activity of ActivityGroup was created or resumed soft keyboard shows immediately. I need it to be show only I click at EditText. My ActivityGroup class:

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();
    }
}
}

I tried to do like this newWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

at new window creation, but it didn't help. Approach like

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

in the nested Activities works properly, but at the Activity creation or resuming keyboard shows and then hides immediately. I don't think it is good solution by reason of keyboard blinking. I also tried to add in the AndroidManifest

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

both in nested Activities, ActivityGroups. But the result remains the same. How can I solve this?

Rikki Tikki Tavi
  • 3,089
  • 5
  • 43
  • 81

3 Answers3

0

This happens because edittexts in your layouts are focusable elements and request focus on start up if none of the other elements requested it. The solution is simple: in all your layout files set focusable and focusableInTouchMode to true in the container layout, so it will request focus first and edit texts won't be focused. Then you can delete your implicitly hiding)

android:focusable="true"
android:focusableInTouchMode="true"
Writer_IP
  • 96
  • 1
  • 7
0

I used hack for this problem. Both in ActivityGroup's class and in child Activities I put

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

before onCreate() and onResume() methods. I will be grateful if somebody who knows tells me more effective solution.

Rikki Tikki Tavi
  • 3,089
  • 5
  • 43
  • 81
0

ActivityGroup using is really bad and slow solution. I've decided to use FragmentActivities with nested Fragments in tabs. Nevertheless sometimes soft keyboard showed when Activity was started. I set text in one of tab without image to the center. I guess, it called soft keyboard showing. My fix(in the TabActivity class):

 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;
           }
       }
Rikki Tikki Tavi
  • 3,089
  • 5
  • 43
  • 81