2

Android の Google ドライブ アプリのテキスト エリアと非常によく似た機能の編集可能なテキスト エリアが必要です。Googleドライブのテキストエリアが何をしているのか知っている人はいますか?

特徴:

  • キーボードを表示しないがカーソルを表示する表示モード
  • カーソルを移動すると、編集アクションが表示されます
  • 編集モードは、ActionBar の編集アクションによってトリガーすることもできます
  • 編集モードでは、書式設定アクションのリストを含む完了/破棄パターンのようなものが表示されます
  • 「完了」を押すと編集モードが終了します
4

1 に答える 1

0

さて、私は現在これに似たものに取り組んでいます。

編集オプションの xml レイアウトを定義します。完了、元に戻す、やり直し、インデント、書式設定。次に、フラグメント クラスを使用してこのビューを拡張します。メイン アクティビティがフラグメントからのクリック イベントをリッスンできるように、内部インターフェイスを実装しました。

package com.aesop.systems.top_bar;

import com.aesop.systems.cerulean.R;
import com.aesop.systems.utils.Frag;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ImageView;

public class TopBarEditor extends Frag implements OnClickListener {

private LinearLayout save;
private ImageView undo, redo, indent, outdent, code_in;

private EditorTopBarListener listen;

@Override
public View onCreateView(LayoutInflater inf, ViewGroup con, Bundle bundy) {
    root = inf.inflate(R.layout.top_bar_editor, con, false);
    loadContent();
    return root;
}

@Override
public void loadContent() {
    save = (LinearLayout) findViewById(R.id.save);
    save.setOnClickListener(this);

    undo = (ImageView) findViewById(R.id.undo);
    undo.setOnClickListener(this);
    redo = (ImageView) findViewById(R.id.redo);
    redo.setOnClickListener(this);
    indent = (ImageView) findViewById(R.id.indent);
    indent.setOnClickListener(this);
    outdent = (ImageView) findViewById(R.id.outdent);
    outdent.setOnClickListener(this);
    code_in = (ImageView) findViewById(R.id.code_in);
    code_in.setOnClickListener(this);
}

@Override
public void onClick(View cl) {
    if(listen != null)
    {
        if(save == cl)
        {
            listen.onSave();
        }
        else if(undo == cl)
        {
            listen.onUndo();
        }
        else if(redo == cl)
        {
            listen.onRedo();
        }
        else if(outdent == cl)
        {
            listen.onOutdent();
        }
        else if(indent == cl)
        {
            listen.onIndent();
        }
        else if(code_in == cl)
        {
            listen.onCodeIn();
        }
    }
}

public interface EditorTopBarListener
{
    public void onSave();
    public void onUndo();
    public void onRedo();
    public void onIndent();
    public void onOutdent();
    public void onCodeIn();
}

public void addEditorTopBarListener(EditorTopBarListener list) { listen = list; }

}

上記のクラスは Frag から拡張されました。通常のカスタム ビューを模倣するために作成したクラス。そのためのコードは次のとおりです。ビュー ルートは、ビューを簡単に見つけるために必要であり、拡張されたクラスが参照できるように保護されています。このため、フラグメントが膨張したときにそれを定義することが不可欠です。すなわち root = inf.inflate(R.layout.top_bar_editor, con, false);

public abstract class Frag extends Fragment {

    protected View root;

    public View findViewById(int id)
    {
        return root.findViewById(id);
    }

    public abstract void loadContent();

}

メイン アクティビティで OnFocusChangedListener を EditText に追加します。

editText1.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus) toggleEditorBar();
            else toggleDefaultBar();
        }
    });

次に、エディター固有のフラグメントを切り替えて、EditText フォーカスが編集モードに変わったときに操作を処理します。フォーカスを失った場合は、デフォルトのバーに戻ります。私の例では、フラグメントの「ホルダー」は ID R.id.topbar を持つ LinearLayout です。トグルするには、次のような便利なメソッドを使用します。

public void toggleDefaultBar()
{
    getFragmentManager().beginTransaction().replace(R.id.top_bar, default_bar).commit();
}

public void toggleEditorBar()
{
    getFragmentManager().beginTransaction().replace(R.id.top_bar, editor_bar).commit();
}

トグルと onFocusChangedListener はメイン アクティビティに実装する必要があり、作成することを選択した場合はカスタム インターフェイスも実装する必要があります。そうでない場合は、フラグメントからルート ビューを返すときに、メインの Activity クラス内のそれぞれに onClickListeners を手動で追加する必要があります。私がまだ試していない小さな例は、次のように実行できます。. .

   TopBarEditor edit = new TopBarEditor(Activity.this);

   ImageView undo = (ImageView) edit.findViewById(R.id.undo);
   undo.setOnClickListener(this);   // if the activity implements a listener

これを行うと、後で読みやすさの問題が発生しますが、そのほうが簡単です。カスタム インターフェイスを実装して、実装されたインターフェイス メソッドから何が呼び出されているかを明示的に把握できるようにすることがわかりました。

お役に立てば幸いです。長々と申し訳ありませんが、これは簡単に実装できるプロセスではありません。この種の質問には、もっと多くのことをお勧めします。

-クリス

于 2014-06-23T05:01:09.660 に答える