3

Android APIでクリップボードをテストしたいので、AndroidのClipboardManagerクラスとClipDataクラスを使用して簡単なアプリケーションを作成することにしました。Android Webサイトのコピーと貼り付けガイドに従いましたが、このガイドには必要なコードのすべての行が含まれていないため、いくつかの箇所に入力する必要がありました(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>
4

1 に答える 1

0

あなたがフォローしているガイドは完全な誤解だと思います! それはとても多くの情報を欠いています。ただし、コードを単純化することをお勧めします。

  • いくつかのブロックにコメントしてみてください
  • テキストのみを扱うことに集中し、残りのことは今のところ忘れてください。

ここにあなたを啓発する良い答えがあります。

ちなみに、私が知る限り、あなたcopy()の方法はまったく問題ありません。paste()あなたの問題は、ContextMenuあなたがそれを処理する方法と関係があります。

于 2012-08-13T19:18:00.020 に答える