2

我需要一个可编辑的文本区域,其功能与 Android 上的 Google Drive 应用程序中的文本区域非常相似。有谁知道如何执行 Google Drive 文本区域正在执行的操作?

特征:

  • 不调出键盘但显示光标的查看模式
  • 当您移动光标时,光标会显示编辑操作
  • 编辑模式也可以通过 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 回答