【问题标题】:Android Clipboard not Copying TextAndroid剪贴板不复制文本
【发布时间】:2012-08-13 18:15:58
【问题描述】:

我想在 Android API 上测试剪贴板,因此我开始使用 Android 的 ClipboardManager 和 ClipData 类创建一个简单的应用程序。我在 Android 网站上关注了Copy and Paste guide,尽管我必须填写几个位置,因为本指南没有必要的每一行代码(我最终不得不注释掉 Intent 和 URI 粘贴方法,因为它没有给出具体的例子,因为我假设是数据的多样性)。我运行应用程序,但由于某种原因,我发送的文本似乎不起作用或显示。有谁知道这可能是什么原因造成的?

这是我的课:

public class MainActivity extends Activity
{
// Creates a URI based on a base URI and a crecord ID based on the contact's last name
// Declares the base URI string
private static final String CONTACTS = "content://com.example.contacts";
// Declares a path string for the URIs that you use to copy data
private static final String COPY_PATH = "/copy";
// Declares the URI to paste to the clipboard
Uri copyURI;

// Declares a MIME type constant to match against the MIME types offered by the provider
private static final String MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact";

private int pasteType;
private Menu menu;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    String lastName = "Nichols";
    copyURI = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);
    setContentView(R.layout.activity_main);
    main();
}

void main()
{
    String text = "Hi, bob!";
    copyText(text);
    String data = paste();
    TextView tv = new TextView(this);
    tv.setText(data);
    setContentView(tv);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@TargetApi(11)
void copyIntent()
{
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    Intent appIntent = new Intent(this, com.example.clipboard.MainActivity.class);
    ClipData clip = ClipData.newIntent("Intent", appIntent);
    clipboard.setPrimaryClip(clip);
    pasteType = 1;
}

@TargetApi(11)
void copyText(String text)
{
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("simple", text);
    clipboard.setPrimaryClip(clip);
    pasteType = 2;
}

@TargetApi(11)
void copyURI()
{
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newUri(getContentResolver(), "URI", copyURI);
    clipboard.setPrimaryClip(clip);
    pasteType = 3;
}

@TargetApi(11)
String paste()
{
    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    /*if (pasteType == 1)
    {
        // Checks to see if the clip item contains an Intent, by testing to see if getIntent() returns null
        Intent pasteIntent = clipboard.getPrimaryClip().getItemAt(0).getIntent();
        if (pasteIntent != null)
        {

        }
    }*/
    if (pasteType == 2)
    {
        String pasteData = "";

        // Gets the ID of the "paste" menu item
        MenuItem mPasteItem = this.menu.findItem(R.id.paste);

        // If the clipboard doesn't conatin data, disable the paste menu item
        if (!(clipboard.hasPrimaryClip()))
            mPasteItem.setEnabled(false);
        else if (!(clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)))
        {
            // This disables the paste menu item, since the clipboard has data, but it is not plain text
            mPasteItem.setEnabled(false);
        }
        else
            mPasteItem.setEnabled(true);

        // Examines the item on the clipboard. If getText() does not return null, the clip item contains the
        // text. Assume the application can only handle one item at a time.
        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

        pasteData = (String) item.getText();
        return pasteData;
    }
    /*if (pasteType == 3)
    {

        ContentResolver cr = getContentResolver();
        ClipData clip = clipboard.getPrimaryClip();

        if (clip != null)
        {
            ClipData.Item item = clip.getItemAt(0);
            Uri pasteUri = item.getUri();
            // If the clipboard contains a URI reference
            if (pasteUri != null)
            {
                // Is this a content URI?
                String uriMimeType = cr.getType(pasteUri);
                // If the return value is not null, the Uri is a content URI
                if (uriMimeType != null)
                {
                    // Does the content provider offer a MIME type that the current application can use?
                    if (uriMimeType.equals(MIME_TYPE_CONTACT))
                    {
                        Cursor pasteCursor = cr.query(pasteUri, null, null, null, null);
                        if (pasteCursor != null)
                        {
                            if (pasteCursor.moveToFirst()) {

                            }
                        }
                        pasteCursor.close();
                    }
                }
            }
        }
    }*/
    return null;
}
}

编辑:这是我的 menu.xml 文件,以帮助找出我的菜单未显示复制/粘贴选项的原因。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world"
    tools:context=".MainActivity" />

</RelativeLayout>

【问题讨论】:

  • the text I am sending doesn't seem to work, or show up 是什么意思?
  • 我正在向它发送文本“嗨,鲍勃!”复制,但只显示一个典型的“Hello world”。
  • 你的意思是paste()返回null?而您的目标是复制和粘贴简单的文本,仅此而已?
  • 也许吧,但我不知道怎么...我粘贴文本时一定有问题,尽管我基本上是使用指南逐字逐句地遵循的(尽管我必须弄清楚MenuItem mPasteItem = this.menu.findItem(R.id.paste); 的一些额外内容...我刚刚意识到,我不确定它是否真的在粘贴。检查菜单,复制和粘贴选项根本没有出现。我想我可能会错过更多.
  • 重要的是,在您进入某种输入视图(如 EditText)之前,粘贴选项不会出现在您的菜单中。它不会通过简单地调用方法来显示。

标签: android clipboardmanager


【解决方案1】:

我认为您所遵循的指南完全是错误的!它缺乏太多的信息。但是,我建议您简化代码:

  • 尝试评论一些区块
  • 只专注于处理文本,暂时忘记其余的。

Here is a good answer 可能会启发你。

顺便说一句,据我所知,您的 copy()paste() 方法完全没问题。您的问题与ContextMenu 以及您的处理方式有关。

【讨论】:

  • 这还能让我测试剪贴板吗?这就是我这样做的全部原因,我有点困惑该链接将如何帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多