EditText中的光标控件

时间:2011-02-10 21:28:40

标签: android android-widget

好的,这将使我疯狂。我还是个新手(也许是个白痴)但是这个让我跑来跑去。

我正在尝试通过软按钮(向左,向右,向上)在editText中实现光标控制。从我研究过的,看起来我需要Selection对象中的方法,如moveUp(),moveLeft(),extendUp()等,但它们都需要一个“text.layout”对象,我不知道如何得到一个。

我是否在正确的轨道上?帮助

2 个答案:

答案 0 :(得分:1)

移动文本光标的简单示例:

package connect1.de;


import android.app.Activity;
import android.os.Bundle;


import android.text.Editable;
import android.text.method.KeyListener;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View.OnClickListener;


public class Connection1 extends Activity implements OnClickListener
{
    /** Called when the activity is first created. */

    private  EditText s1 = null;
    private  EditText s2 = null;
    Button button1;
    Button button2;
    private  EditableInputConnection in;
    private test1 t1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // dieser Aufruf funktioniert nicht !!
        // in = new  EditableInputConnection(s1);

        setContentView(R.layout.main);
        // so hunktioniert der Aufruf ohne Absturz
        s1 = (EditText) findViewById(R.id.editText1);
        // s2 = (EditText) findViewById(R.id.editText2);
        s1.setText("Test Button");
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        // t1 = new test1(s1);
        in = new  EditableInputConnection(s1);

        // dies bewirkt ein absolutes Verschieben des Textcursors auf Position 10 - 1, 1 zeigt ans Ende der Eingabe
        // in.commitText("", 5);
        // in = new  EditableInputConnection(s1);
        // in.commitText("", 7);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        // in.cursor_pos();
    }

    /*
     * Copyright (C) 2007-2008 The Android Open Source Project
     * 
     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
     * use this file except in compliance with the License. You may obtain a copy of
     * the License at
     * 
     * http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     * License for the specific language governing permissions and limitations under
     * the License.
     */


    /*
     * Copyright (C) 2007-2008 The Android Open Source Project
     * 
     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
     * use this file except in compliance with the License. You may obtain a copy of
     * the License at
     * 
     * http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     * License for the specific language governing permissions and limitations under
     * the License.
     */
     public void onClick(View v) 
     {
         int pos = 0;
         pos = in.cursor_pos();
         // wie können die verschiedenen Schaltflächen unterschieden werden
         if (v.findViewById(R.id.button2) == findViewById(R.id.button2))
           // s1.setText(v.findViewById(R.id.button2) + "");
           pos = pos + 2;
         // else
           // s1.setText("Linke Taste gedrückt");

         // für links
         // in.commitText("", pos);
         // -1 hat auch Wirkung für Linksschritt
         in.commitText("", pos );

     }


    public class test1
    {
          private final TextView mTextView;

          public test1(TextView textview)
          {
              mTextView = textview;
              mTextView.setText("Klasse 1");
          }
    }
    public class EditableInputConnection extends BaseInputConnection 
    {
        private static final boolean DEBUG = false;
        private static final String TAG = "EditableInputConnection";

        private final TextView mTextView;

        public EditableInputConnection(TextView textview) 
        {
            super(textview, true);
            mTextView = textview;
            // mTextView.setText("Inputconnection");
        }

        public Editable getEditable() 
        {
            TextView tv = mTextView;
            if (tv != null) 
            {
                return tv.getEditableText();
            }
            return null;
        }

        public boolean beginBatchEdit() 
        {
            mTextView.beginBatchEdit();
            return true;
        }

        public boolean endBatchEdit() 
        {
            mTextView.endBatchEdit();
            return true;
        }

        public boolean clearMetaKeyStates(int states) 
        {
            final Editable content = getEditable();
            if (content == null) return false;
            KeyListener kl = mTextView.getKeyListener();
            if (kl != null) {
                try {
                    kl.clearMetaKeyState(mTextView, content, states);
                } catch (AbstractMethodError e) {
                    // This is an old listener that doesn't implement the
                    // new method.
                }
            }
            return true;
        }

        public boolean commitCompletion(CompletionInfo text) 
        {
            if (DEBUG) Log.v(TAG, "commitCompletion " + text);
            mTextView.beginBatchEdit();
            mTextView.onCommitCompletion(text);
            mTextView.endBatchEdit();
            return true;
        }

        public boolean performEditorAction(int actionCode) 
        {
            if (DEBUG) Log.v(TAG, "performEditorAction " + actionCode);
            mTextView.onEditorAction(actionCode);
            return true;
        }

        public boolean performContextMenuAction(int id) 
        {
            if (DEBUG) Log.v(TAG, "performContextMenuAction " + id);
            mTextView.beginBatchEdit();
            mTextView.onTextContextMenuItem(id);
            mTextView.endBatchEdit();
            return true;
        }
        public int cursor_pos()
        {
            int anzahl = 0;
            CharSequence str ;
            str = super.getTextBeforeCursor(s1.length(), 0);
            // s2.setText(str.length()+ "");
            anzahl = str.length();
            return anzahl;
        }
        public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) 
        {
            if (mTextView != null) 
            {
                ExtractedText et = new ExtractedText();
                if (mTextView.extractText(request, et)) {
                    if ((flags&GET_EXTRACTED_TEXT_MONITOR) != 0)
                     {
                        // dieser Aufruf funktioniert nicht !!
                        // mTextView.setExtracting(request);
                    }
                    return et;
                }
            }
            return null;
        }

        public boolean performPrivateCommand(String action, Bundle data) 
        {
            mTextView.onPrivateIMECommand(action, data);
            return true;
        }

        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) 
        {
            // notwendig, da sonst Eingabetext für Inputmethode nicht aktualisiert wird!!
            mTextView.setText(s1.getText());
            if (mTextView == null) 
            {
                return super.commitText(text, newCursorPosition);
            }
            CharSequence errorBefore = mTextView.getError();
            // mTextView.setText("");

            boolean success = super.commitText(text, newCursorPosition);
            CharSequence errorAfter = mTextView.getError();

            if (errorAfter != null && errorBefore == errorAfter) 
            {
                mTextView.setError(null, null);
            }

            // s2.setText(newCursorPosition + "");
            return success;

        }
    }

}

答案 1 :(得分:0)

听起来你想使用DynamicLayout对象。 (它是text.Layout的派生类之一,另一个是StaticLayout。)