1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

softkey

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von blackphoenix, 28.09.2010.

  1. blackphoenix, 28.09.2010 #1
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    gibt es eine lösung, dass man dieses blöde softinputzeugs einfach einblendet? es gibt 1000e codeschnippsel im internet mit show_implicit oder show_force, jedoch funktioniert KEINE! kann man dieses blöde zeug nicht einfach erzwingen...was ich bräuchte wäre so ein show_force_undzwar_wirklich_sonst_wirst_du_verdammt_noch_mal_vergewaltigt_du_bloedes_android_zeug. gibts so was? ich finde diese konstante nicht...ich such schon lang danach :p
     
  2. MetBo, 28.09.2010 #2
    MetBo

    MetBo Fortgeschrittenes Mitglied

    Beiträge:
    264
    Erhaltene Danke:
    4
    Registriert seit:
    14.05.2010
    Bei einem EditText, oder wo & wann?
     
  3. blackphoenix, 28.09.2010 #3
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    naja, eig. egal...möchte das einfach gesteuert das zeugs aufploppt / schließt...die editbox kann ich ja invisible machn..denkt man...awa das zeug geht ned auf, egal was ich mach. beim iphone gez ja auch super...
     
  4. blackphoenix, 28.09.2010 #4
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    ich würd ja auch ein touchevent simuliern...bzw. hab ich schon...awa das tut nichts..wenn ich nur ein ACTION_DOWN zeug schick, dann kommt nach einer zeit der select all / copy / ..blabla dialog...aba wenn ich ACTION_DOWN, gefolgt von ACTION_UP schicke, kommt nichts...wieso muss das so komisch sein?
     
  5. MetBo, 28.09.2010 #5
    MetBo

    MetBo Fortgeschrittenes Mitglied

    Beiträge:
    264
    Erhaltene Danke:
    4
    Registriert seit:
    14.05.2010
    Ich verstehe immer noch nicht was du möchtest.

    Möchtest du beim Start der Activity deine Tastatur eingeblendet bekommen, oder was?

    Schildere mal genau dein Problem und schreibe deine Sätze richtig aus, man versteht nichts sorry!
     
  6. blackphoenix, 28.09.2010 #6
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    tut mir leid, bin sehr aufgeregt. ich möchte einfach, dass ich text eingeben kann und diesen abfragen kann. ich zeichne nativ, über opengl mit dem ndk. ich habe keine normale android-gui, alles ist selbst gezeichnet. ich will aber kein keyboard selbst programmiern, ich will das built-in keyboard nehmen...dafür will ich eine invisible textbox haben und ich will, dass der benutzer text eingeben kann und ich den text abfragen kann / weiß, wann welche taste gedrückt wurde und diesen text dann immer in meine selbst gezeichnete textbox (über opengl) anzeigen...jedoch stehe ich vor einer mauer und ich versteh nicht warum...
     
  7. blackphoenix, 28.09.2010 #7
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    wobei die tatsache, dass das mit dem ndk gemacht wird, eigentlich nebensächlich ist. ich will einfach nur, dass sich eine tastatur aufmacht und ich aber keine textbox sehe...es ist ein nämlich ein spiel und da bin ich einfach gezwungen, das so zu machen.
     
  8. MetBo, 28.09.2010 #8
    MetBo

    MetBo Fortgeschrittenes Mitglied

    Beiträge:
    264
    Erhaltene Danke:
    4
    Registriert seit:
    14.05.2010
    Gibt es im NDK nicht auch einen Parameter bzw. eine Methode mit der man die Tastatur aufrufen kann? Kenne mich leider gar nicht mit dem NDK aus.

    Dachte du meinst das SDK ^^ ;)
     
  9. blackphoenix, 28.09.2010 #9
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    nana, eigentlich ist das egal...ich will ja über das sdk diese tastatur anzeigen..ich wollt nur alles komplett schildern, aber es spielt in wahrheit keine rolle...ich will einfach eine tastatur haben, jedoch keine textbox sehen. ich versteh aber das problem nicht, warum das so schwer ist.
     
  10. blackphoenix, 28.09.2010 #10
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    Code:
    new Thread() { 
    			public void run()
    			{
    				EditText editText = (EditText) findViewById(R.id.myEdit);
    				//editText.setVisibility(View.INVISIBLE);
    		        editText.setFocusable(true);
    		    
    		        editText.requestFocus();
    		        MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 5, 5, 0);
    		       
    		        editText.onTouchEvent(me);
    		        SystemClock.sleep(200);
    		        me = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.
    		        		
    		        		ACTION_UP, 6, 6, 0);
    
    		        editText.onTouchEvent(me);
    			}
    		}.start();
    
    so wollte ich ihn besiegen...jedoch geht das nur am simulator und außerdem geht das invislbe auch nicht :(, aber das keyboard ist da!
     
  11. MetBo, 28.09.2010 #11
    MetBo

    MetBo Fortgeschrittenes Mitglied

    Beiträge:
    264
    Erhaltene Danke:
    4
    Registriert seit:
    14.05.2010
    Damit kann ich etwas ausblenden ^^
     
  12. blackphoenix, 29.09.2010 #12
    blackphoenix

    blackphoenix Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    28.09.2010
    Falls es jemanden interessiert, ich habe (eine) mögliche Lösung entwickelt, die endlich einmal FUNKTIONIERT!
    AndroidKeyBoard.java:
    Code:
    package vl.base;
    
    import android.text.Editable;
    import android.text.InputType;
    import android.text.method.KeyListener;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    
    public class AndroidKeyBoard implements KeyListener {
    	protected boolean enabled;
    	protected EditText box;
    	private InputMethodManager mngr;
    	private KeyBoardListener listener;
    	
    	//could be inlined, but yeah..its tschawa!
    	public AndroidKeyBoard(InputMethodManager mngr, EditText box, KeyBoardListener keyboali) 
    	{ 
    		this.box = box;
    		this.listener = keyboali;
    		box.setKeyListener(this);
    		this.mngr = mngr;
    	}
    	
    	//has to be called, before the program exits, otherwhise the keyboard
    	//won't close!
    	public void close() 
    	{ 
    		hide();
    	}
    	
    	protected void hide()
    	{
    		mngr.hideSoftInputFromWindow(box.getWindowToken(), 0);
    	}
    	
    	protected void show()
    	{ 
    		box.requestFocus();	//necessary?? yeah, lets take the secure way...
    		mngr.showSoftInput(box, InputMethodManager.SHOW_FORCED);
    	}
    	
    	public void show(boolean shx)
    	{
    		if (enabled != shx)
    		{
    			if (shx)
    				show();
    			else
    				hide();
    			enabled = shx;
    		}
    	}
    
    	public void clearMetaKeyState(View view, Editable content, int states) {
    	}
    
    	public int getInputType() {
    		//more or less similar look and feel as the good old iphone keyboard
    		return InputType.TYPE_NULL;
    	}
    	
    	//just eat everything, yeah this thing is very greedy!
    	public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
    		if (enabled)
    			listener.keyboardChange(event.getUnicodeChar(), keyCode);
    		return true;
    	}
    
    	public boolean onKeyOther(View view, Editable text, KeyEvent event) {
    		return true;
    	}
    
    	public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
    		return true;
    	}
    
    	public void onHardWareKeyBoardShown(boolean b) {
    		if (enabled)
    			if (b)
    				hide();
    			else
    				show();
    	}
    }
    
    
    AndroidKeyBoardActivity.java:
    Code:
    package vl.base;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.res.Configuration;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    
    public abstract class AndroidKeyBoardActivity extends Activity implements KeyBoardListener {
    	
    	//x is a kewl letter...so use it :P
    	protected AndroidKeyBoard kbx;
    	
    	@Override
    	protected void onDestroy()
    	{
    		super.onDestroy();
    		kbx.close();
    	}
    	
    	public abstract int getMainViewID();
    	public abstract View getMainView();
    	
    	@Override
    	public void onCreate(Bundle savedInstanceState) 
    	{
    		super.onCreate(savedInstanceState);
    		EditText editText;
    		LinearLayout l = new LinearLayout(getApplicationContext());
            l.addView(getMainView() != null ? getMainView() : ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
                    inflate(getMainViewID(), null), new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
                    		ViewGroup.LayoutParams.FILL_PARENT));
            l.addView(editText = new EditText(this.getApplicationContext()), 
            		new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)		
            );
            setContentView(l);
    		kbx = new AndroidKeyBoard((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE), 
    				editText, this);
    	}
    	
    	//important preconditions: 
    	/*
    	 * activity tag of the xml manifest must include something like this
    	 * android:configChanges="keyboardHidden"
    	 */
    	@Override
        public void onConfigurationChanged(Configuration newConfig) 
    	{
        	super.onConfigurationChanged(newConfig);
        	if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)
        		kbx.onHardWareKeyBoardShown(true);
        	else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES)
        		kbx.onHardWareKeyBoardShown(false);
        }
    }
    
    
    KeyBoardListener.java:
    Code:
    package vl.base;
    
    public interface KeyBoardListener {
    	public void keyboardChange(int sign, int code);
    }
    
    
    Man braucht lediglich anstelle von der Activity von AndroidKeyBoardActivity erben (extends AndroidKeyBoardActivity).
    Wichtig sind dabei, dass folgende Methoden implementiert werden (sind sowieso abstract:
    Code:
    /*return xml-document id. 0, if view with the given instance should be taken*/
    	public int getMainViewID() {
    		return 0;
    	}
    
    /*return instance to the content view, null otherwhise if xml-document should be parsed*/
    	@Override
    	public View getMainView() { return null; }
    
    /*key with unicode sign "sign" and keycode "code" was pressed*/
    public void keyboardChange(final int sign, final int code) { }
    
    Sofern getMainView null zurück liefert, wird die XML-Datei mit der ID getMainViewID geladen und diese View als Contentview gesetzt.
    D.h. in der Activity, die von der AndroidKeyBoardActivity erbt, soll KEINE Contentview gesetzt werden. Dies wird bereits in der AndroidKeyBoardView getan. Grund dafür ist, dass Edittext nicht invisible gesetzt werden darf, weil sonst das Keyboardöffnen nicht funktioniert. Auch hier gibt es wieder einen kleinen Trick...die zurückgelieferte View bei getMainView bzw. getMainViewID wird einfach in einen "LinearLayout"-Container gebaut. Als Optionen werden intern FILL_PARENT angegeben. Der EditText wird auch angehängt, jedoch von der vorigen View VERDECKT.
    Diese Lösung funktioniert eigentlich auch mit HW-Keyboards, d.h. es sollte erkannt werden, wann ein keyboard offen oder geschlossen wird.
    Das Keyboard generell wird mit
    Code:
    kbx.show(true);
    eingeblendet und
    Code:
    kbx.show(false);
    ausgeblendet.
    Damit das Erkennen, des Öffnens der Tastatur funktioniert, muss im activity-Tag des Manifests folgendes Vorkommen (oder durch logisches Oder verknüpft werden!)
    Code:
    android:configChanges="keyboardHidden"
    .
    Hoffe, ich habe nichts vergessen.
    Diese Methode eignet sich prima, um ganz einfach (Haha!) NUR ein Keyboard anzuzeigen und zwar nur dann, wenn die HW-Tastatur nicht gerade offen ist.
    Zusätzlich wird, wie bereits erwähnt, dynamisch auf das Ereignis des Öffnens der Tastatur reagiert. Zu beachten ist, dass die Callback-Funktion "keyboardChange" natürlich nur aufgerufen wird, wenn "kbx.show(true);" aufgerufen wurde...andernfalls kann man auch auf der HW-Tastatur so viel drücken, wie man will.

    Sollte das Öffnen des keyboards von einem anderen Thread gewünscht sein, müsste man in der Activity (die von AndroidKeyBoardActivity erbt) einen Handler definieren:

    Code:
    private Handler h = new Handler() {
    		@Override
    		public void handleMessage(Message msg)
        	{
        			kbx.show(msg.what == 1);
        	}
        };
    Mit dem Aufruf
    Code:
    h.sendEmptyMessage(b);
    von einem anderen Thread, wird trotzdem sichergestellt, dass keine Exception geworfen wird, die normalerweise auftritt, wenn Views von Threads manipuliert werden, die diese nicht erzeugt haben.

    Sollte alles sein, viel Spaß :p
     

Diese Seite empfehlen