質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Java

    14473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3919questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • ドラッグ&ドロップ

    8questions

    コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

ドラッグアンドドロップ

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 744

yuka3846

score 4

ドラッグアンドドロップすることで数字を入れ替えるシステムを作りたいと考えています。
この状態では指が触れたマス目が色が付き、ランダムでマス目が振動するものです。
これを改良して(おそらくonTouchEventのところでしょうか?)数字が入れ替わる仕組みの作り方を教えていただけますでしょうか。
java初心者なので全然わかりません。アルゴリズム等アドバイスいただけたらと思います。よろしくお願いします。

package com.example.admin.a0116myapplication;

import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    int COL=4;
    int ROW=4;
    int ON_VIB_NUM=4;
    int viewId[] = new int[COL*ROW+1];

    /* vibがオンの番号 */
    int onVib[] = new int[ON_VIB_NUM];

    //最後にタッチしたViewの列番号と行番号を保持
    private int fromRow = -1;
    private int fromCol = -1;
    private int fromId = -1;

    //現在タッチしたViewに書いてある番号を保持
    private int toRow = -1;
    private int toCol = -1;
    private int toId = -1;

    MainActivity(){
        Random rand = new Random();
        for(int i = 0; i<3; i++){
            onVib[i] = rand.nextInt(16)+1;

            int x = onVib[i];
            for(i = 0; i<16; i++){
                if(onVib[i]==x)
                    break;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*端末の画面の幅を取得*/
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        Display disp = wm.getDefaultDisplay();
        Point size = new Point();
        disp.getSize(size);
        int mainWidth = size.x;

        /* ROW*COLテンキーの外枠のインスタンス*/
        TableLayout tenKey = (TableLayout) findViewById(R.id.ten_key);
        for(int numCol=0;numCol<COL;numCol++){
            /* テンキーの行部分のインスタンス*/
            TableRow tableRow = new TableRow(this);
            for(int numRow=1;numRow<ROW+1;numRow++){
                /* テンキーの要素のインスタンスの生成と番号付け */
                TextView tenKeyTextView = (TextView) getLayoutInflater().inflate(R.layout.ten_key_button,null);
                tenKeyTextView.setText(String.valueOf(numCol*COL+numRow));

                /* テンキー要素にIDを付与 */
                viewId[numCol*COL+numRow] = tenKeyTextView.generateViewId();
                tenKeyTextView.setId(viewId[numCol*COL+numRow]);

                /* 画面幅よりテンキーの要素ごとの大きさを設定 */
                tenKeyTextView.setWidth((int)((float)mainWidth/(float)(COL+0.5)));
                tenKeyTextView.setHeight((int)((float)mainWidth/(float)(ROW+0.5)));
                tenKeyTextView.setGravity(Gravity.CENTER);

                /* テンキーの要素を行部分に入れる*/
                tableRow.addView(tenKeyTextView);
            }
            /* テンキーの行部分をテンキーの枠に入れる */
            tenKey.addView(tableRow);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        for(int numCol=0;numCol<COL;numCol++) {
            for(int numRow = 1; numRow < ROW + 1; numRow++) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: {

                        if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){

                            //今タッチした所
                            fromCol = numCol+1;
                            fromRow = numRow+0;
                            fromId =viewId[numCol*COL+numRow];
//                            Log.d("fromId", String.valueOf(fromId));
                        }

                    }
                    case MotionEvent.ACTION_MOVE:{

                        View fromView;
                        View toView;

                        if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){

                            toCol = numCol+1;
                            toRow = numRow+0;
                            toId = viewId[numCol*COL+numRow];
//                            Log.d("toId", String.valueOf(viewId[numCol*COL+numRow]));

                            fromView = findViewById(fromId);
                            toView = findViewById(toId);

                            //隣のマス目にまたいだら入れ替え処理
                            if(fromId != toId){

                            }

                        }
                    }
                }
            }
        }

        //各フィールド変数を更新
//        fromRow = // //;
//        fromCol = // //;
//        fromId =  // //;
//
        return true;
    }

    /* view内に(x,y)が存在するか */
    private boolean inViewBounds(final View view, int x, int y){
        Rect outRect = new Rect();
        view.getDrawingRect(outRect);
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        outRect.offset(location[0], location[1]);
        //Log.d("TouchEvsyent", "X:" + location[0] + ",Y:" + location[0]);
        return outRect.contains(x, y);
    }

    private void randOnVib(){
        boolean duplicate=false;
        Random rnd = new Random();
        for(int i=0;i<ON_VIB_NUM;i++) {
            while(true) {
                onVib[i] = rnd.nextInt(COL * ROW) + 1;
                for (int j=0;j<i;j++) {
                    if (onVib[i] == onVib[j]) {
                        duplicate = true;
                    }
                }
                if (!duplicate) {
                    break;
                }
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:id="@+id/main"
    tools:context="com.example.admin.a0116myapplication.MainActivity">

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="start"/>

    <Button
        android:id="@+id/vibAnsButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ok"
        android:layout_below="@+id/text"
        android:layout_alignParentStart="true" />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/vibAnsButton"
        android:id="@+id/ten_key">


    </TableLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
</TableLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="0dp"
    >

</TextView>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2017/01/17 15:12

    コード用の記述に修正してください。

    キャンセル

  • yuka3846

    2017/01/17 15:46

    ご指摘ありがとうございます。一番上からMainactivity.java、activity_main.xml、ten_key.xml、ten_key_button.xmlです。アドバイス頂けたら幸いです。よろしくお願い致します。

    キャンセル

回答 1

checkベストアンサー

0

・最後にタッチしたViewの列番号と行番号を保持するフィールド変数を追加する。
・最後にタッチしたViewに書いてある番号を保持するフィールド変数を追加する。
・onTouchEventで今タッチしている列番号と行番号と最後にタッチした列番号と行番号を比較し、異なる場合は今タッチしているViewに最後にタッチしたViewの番号を入れ替え処理を行う。
・onTouchEventの最後に各フィールド変数を更新する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/17 18:15

    回答ありがとうございます!!
    行き詰っていたので本当にありがたいです!!
    明日yona様の回答を元に再度挑戦してみます!
    また何かありましたら質問させてくださいm(._.)m

    キャンセル

  • 2017/01/19 15:35

    @Override
    public boolean onTouchEvent(MotionEvent event) {

    for(int numCol=0;numCol<COL;numCol++) {
    for(int numRow = 1; numRow < ROW + 1; numRow++) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
    //最後にタッチしたViewの列番号と行番号を保持
    int fromRow = // //;
    int fromCol = // //;
    int fromId = viewId[numCol*COL+numRow];

    }
    case MotionEvent.ACTION_MOVE:{
    //最後にタッチしたViewに書いてある番号を保持するフィールド変数を追加する
    int toRow = // //;
    int toCol = // //;
    int toId = inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())

    if(fromRow != toRow || fromCol != toCol){
    //入れ替え処理
    }

    }
    }

    //Log.d("TouchEvent", "X:" + event.getX() + ",Y:" + event.getY());
    /* タッチしている場所がテンキーの要素の中にあるか*/
    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){

    }else{

    }

    }
    }
    return true;
    }

    onTouchEventをいじってみましたが、ここから先に進めません、、
    switch文を使ってみましたが、入れ替え処理や変数の保持の仕方などどうすればよいのでしょうか??
    手取り足取り聞いてしまい申し訳ありません、、来週の半ばまでに完成させなければならないのでご協力をお願いいたします。

    キャンセル

  • 2017/01/19 15:55

    フィールド変数の意味がわかりますか?

    キャンセル

  • 2017/01/19 16:18

    すみません、わからないです。

    キャンセル

  • 2017/01/19 16:46

    調べましたか?
    調べてないのに質問するのは良くないですよ。

    キャンセル

  • 2017/01/24 12:51

    返信が遅くなり申し訳ありません。 
    すみません、最初に頂いた流れの部分でフィールド変数に気づかずに普通にただ変数として勘違いしていました。 調べてみたらクラスのメソッド外に宣言するとありました。なので私なりにメソッドの外に変数を設定してみました。 合っていますでしょうか??

    キャンセル

  • 2017/01/24 15:56

    あっています。初期値はhoge=-1とかにしとくといいですよ。

    キャンセル

  • 2017/01/24 16:05

    コメントありがとうございます。
    すみません、hogeを調べたら特に意味のない適当な名前の代表例と出ましたが、
    //最後にタッチしたViewの列番号と行番号を保持
    private int fromRow = -1;
    private int fromCol = -1;
    private int fromId = -1;

    //現在タッチしたViewに書いてある番号を保持
    private int toRow = -1;
    private int toCol = -1;
    private int toId = -1;
    こういうことでしょうか??

    キャンセル

  • 2017/01/24 16:19

    その通りです。

    キャンセル

  • 2017/01/24 16:33

    コメントありがとうございます。
    わかりました。

    ACTION_DOWNのタッチしたマス目の情報を自分なりに考えてみたのですがどうでしょうか??

    また、ACTION_MOVEでタッチしながらドラッグして隣のマス目にまたいだらという部分はどうすればよいのでしょうか??m(__)m

    @Override
    public boolean onTouchEvent(MotionEvent event) {

    for(int numCol=0;numCol<COL;numCol++) {
    for(int numRow = 1; numRow < ROW + 1; numRow++) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {

    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){
    //タッチした所
    fromCol = COL+1;
    fromRow = numRow;
    fromId = viewId[numCol*COL+numRow];
    }

    }
    case MotionEvent.ACTION_MOVE:{
    if(fromRow != toRow || fromCol != toCol){
    //隣のマス目にまたいだら入れ替え処理
    }
    }
    }
    }
    }

    //各フィールド変数を更新
    fromRow = // //;
    fromCol = // //;
    fromId = // //;

    return true;
    }

    キャンセル

  • 2017/01/24 16:43

    跨いだらテキストの入れ替えを行うんじゃないんですか?

    キャンセル

  • 2017/01/24 16:50

    そうです。入れ替えをしたいのですがACTION_DOWNとACTION_MOVEの部分にどう記述すればよいのか分からない状態です、、

    キャンセル

  • 2017/01/24 16:54

    やることはViewの特定ですよね?アクションダウンのときのViewとアクションムーブのときのViewを特定すればできますよね。

    キャンセル

  • 2017/01/24 17:05

    そのviewの特定に苦戦しています、、色んなワードで調べてみましたが座標の特定なら調べるとたくさん出てきましたがx座標=列というわけでもないので違うと思いましたし、プログラミングに詳しい友人にも聞いてみましたが全く手が出ない状態です、、m(__)m

    キャンセル

  • 2017/01/24 17:18

    すぐにウェブで調べるのではなく自分で考えましょう。
    保存しているfromColとfromRowには何が入っているんですか?

    キャンセル

  • 2017/01/24 17:21

    すみません、今回がプログラミング初めてなので一文一文所見のものは調べて覚えてを繰り返しているので、、
    初期段階では-1が入っているということですよね??

    キャンセル

  • 2017/01/24 17:23

    それは初期値の話です、アクションダウンで入れた値は何を表しているんですか?

    キャンセル

  • 2017/01/24 17:32

    合っているかはわかりませんが、自分なりに押したマス目の行と列と番号をfromCol,fromRow,fromIdに入れたつもりです。

    キャンセル

  • 2017/01/24 17:37

    それがわかるならViewは特定できますよね。

    キャンセル

  • 2017/01/24 17:53

    すみません、Viewの特定というイメージがよくつかめていないのですが

    @Override
    public boolean onTouchEvent(MotionEvent event) {

    for(int numCol=0;numCol<COL;numCol++) {
    for(int numRow = 1; numRow < ROW + 1; numRow++) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {

    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){
    //今タッチした所
    fromCol = numCol+1;
    fromRow = numRow;
    fromId = viewId[numCol*COL+numRow];
    }

    }
    case MotionEvent.ACTION_MOVE:{
    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){

    //今タッチした所
    toCol = numCol+1;
    toRow = numRow;
    toId = viewId[numCol*COL+numRow];

    //隣のマス目にまたいだら入れ替え処理
    if(fromId != toId){

    //行
    int x = fromCol;
    fromCol = toCol;
    toCol = x;

    //列
    int y = fromRow;
    fromRow = toRow;
    toRow = y;

    //番号
    int z = fromId;
    fromId = toId;
    toId = z;
    }

    }

    }
    }
    }
    }

    //各フィールド変数を更新
    // fromRow = // //;
    // fromCol = // //;
    // fromId = // //;
    //
    return true;
    }

    こういう事でしょうか?

    キャンセル

  • 2017/01/24 22:36 編集

    どういうことでしょうか。
    落ち着いてやりたいことを整理してください。とりあえずでコードを変更して見せられてもわかりません。

    あなたがやりたいことはアクションダウンの起きたViewとアクションムーブの起きたViewで中の文字を入れ替えるということですよね?

    だからそれぞれのViewを特定しないといけないと回答しているんです。とりあえず取得しているidでfindViewByIdを行い、テキストをログ出力してみてください。

    キャンセル

  • 2017/01/25 09:04

    コメントありがとうございます。
    すみません、初心者なのでviewの特定と言われてもそこが分からないので自分なりに考えてやってみた結果になってしまいました、、

    findviewbyidですね。アドバイスありがとうございます。
    今日は外出してしまうので明日どういうものか調べながらやってみます。

    キャンセル

  • 2017/01/26 16:57

    一応log.dで記述して、デバッグしてみたら中身のnumCol*COL+numRowにはタッチした番号が入っていることが確認できました。
    findViewByIdの文についてはまだ理解が足りず使えていないのですが(:_;)

    case MotionEvent.ACTION_DOWN: {

    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){
    //今タッチした所
    fromCol = numCol+1;
    fromRow = numRow;
    Log.d("fromId", String.valueOf(numCol*COL+numRow));
    //fromId = (TextView) findViewById(fromId);
    }

    }

    キャンセル

  • 2017/01/26 17:09

    ちなみにConsoleという所を見てみたらタッチしてからドラッグしているとfromId,toIdには触っているマス目がちゃんと記録されているようでした。

    キャンセル

  • 2017/01/26 17:13

    あとは数字を入れ替えたら終わりですね。

    キャンセル

  • 2017/01/26 17:52

    様々なアドバイス本当にありがとうございます。
    javaの部分修正してみましたが、Consoleで確認したfindViewByIdにはnullとなってしまいました、、
    また、またいだ入れ替え処理の部分には一切数字が入っていないようでテキストを入れ替えることができませんでした、、(:_;)

    キャンセル

  • 2017/01/26 17:59

    ではあなたが言っているfromIdは誤りです。fromIdはViewのidじゃないんですか?

    キャンセル

  • 2017/01/26 18:15

    アドバイスいただいた通りLog.d("fromId", String.valueOf(numCol*COL+numRow));このようにして触ったnumCol*COL+numRowをログでfromIdとして出力しました。

    ちなみにこのnumCol*COL+numRowにはタッチした番号は入っていることが確認済みです。
    恐らくfromid = findViewById(fromId);こちらの文が間違っているのかと、、

    キャンセル

  • 2017/01/26 18:18

    Viewのidの意味がわかりますか?

    キャンセル

  • 2017/01/26 18:23

    タッチした番号それぞれのリソースidということですよね??(:_;)

    キャンセル

  • 2017/01/26 18:50

    はい。
    findViewByIdはそのidからViewを取得するためのメソッドです。これがnullを返すということはidが存在しないからです。
    なので、あなたがfromIdに入れたという値は間違っています。

    キャンセル

  • 2017/01/26 18:54

    そうするとLog.dが間違っているということですか??

    キャンセル

  • 2017/01/26 19:15

    あなたが間違っているんですよ。
    名前からしてviewId[]はviewIdを保持している配列じゃないんですか?
    Log.dに出力しているのはこの配列の要素番号じゃないんですか。

    キャンセル

  • 2017/01/27 11:38

    コメントありがとうございます。
    私が間違っているのは重々承知です。
    はい。そのつもりで出力したのですが要素番号を出力したのが間違いという事ですか??

    キャンセル

  • 2017/01/27 12:10

    ログ出力は値を確認するために行なっています。そのためログ出力処理自体に正しい誤りはなく、ログ出力で出力された値が誤っていると言っています。

    あなたが書いたコードは下記のようにするんじゃないんですか?
    findViewById(viewId[fromId])

    キャンセル

  • 2017/01/27 13:00

    Log.d("fromId", String.valueOf(viewId[numCol*COL+numRow]));
    fromid = findViewById(viewId[fromId]);

    このようにしてみましたが、Consoleでjava.lang.IndexOutOfBoundsException : Invalid array index: -1、fromId=-1,fromid=nullと出てしまいました。 ちなみにfromidはView型で宣言しています。

    キャンセル

  • 2017/01/27 13:11

    なぜView型のfromidとはなんですか、またなぜそんなわかりにくい名前を付けたんですか。
    なぜint型のfromIdを使用していないんですか。

    私のコメントでそのようなことをしたならどのコメントでそうしようと思ったんですか?

    キャンセル

  • 2017/01/27 13:23

    fromidをint型にしたらfromid = findViewById(viewId[fromId]);の部分がエラーになってしまったのでView型にしてみました、、(:_;)

    キャンセル

  • 2017/01/27 14:19

    適当に変えてできませんでした、では私には回答できません。

    キャンセル

  • 2017/01/27 14:22

    yona様もわからないということですか??

    キャンセル

  • 2017/01/27 14:24

    すみません、私が適当に変えてできなかったということですね。失礼いたしました。

    キャンセル

  • 2017/01/27 14:40

    はい、あなたがあなたの考えでコメントとは異なることをして、そのことをコメントに書かないなら私には回答できません。
    あとから「ちなみに…」と言われても不快です。

    それはそれとして下記のことをやってください。疑問があるなら先に質問してください。

    ・View型のfromidを削除してください。
    ・アクションダウン時にfromIdにviewId[numCol*COL+numRow]を入れてください。
    ・アクションムーブ時にtoIdにviewId[numCol*COL+numRow]を入れてください。
    ・アクションムーブ時にローカル変数View fromViewを宣言してください。
    ・アクションムーブ時にローカル変数View toViewを宣言してください、
    ・fromView=findViewById(fromId)とtoView=findViewById(toId)をしてください。

    キャンセル

  • 2017/01/27 15:11

    不快な気分にさせてしまい申し訳ありませんでした。

    コメントいただいた部分トップのjavaコードに追加させていただきました。
    質問としては
    ・アクションダウン時にfromIdにviewId[numCol*COL+numRow]を入れてください。
    ・アクションムーブ時にtoIdにviewId[numCol*COL+numRow]を入れてください。
    こちらの二つについて以前アドバイスを頂いたLogの出力とfindViewBuIdどう組み合わせればよいのでしょうか??


    キャンセル

  • 2017/01/27 15:30

    logの出力は確認のためだと言いましたよね?log出力の意味を理解していない以上考えても無駄なので忘れてください。

    で、値は入れましたか?

    キャンセル

  • 2017/01/27 15:40

    すみません、ログの意味を勘違いしていました。
    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){
    //今タッチした所
    fromCol = numCol+1;
    fromRow = numRow+0;

    //Log.d("fromId", String.valueOf(viewId[numCol*COL+numRow]));
    fromId = viewId[numCol*COL+numRow];
    }
    fromIdとtoIdの文も追加してみましたがやはりviewId[numCol*COL+numRow]にはタッチした番号が入るのですがfromIdには-1と出てしまいます、、(:_;)

    キャンセル

  • 2017/01/27 15:53

    viewIdに値を入れるんじゃないですよ、取り出すんですよ。

    コメントにあるif文の式の中でやってるじゃないですか。
    それでfromIdが-1になるならviewIdが間違っていることになります。

    キャンセル

  • 2017/01/27 16:00

    すみません、言い方を間違えました。

    Variables?という所でデバッグしてある番号をタッチした時にviewId[numCol*COL+numRow]にはタッチした番号がちゃんと入っている事が確認できたのですが、

    fromId = viewId[numCol*COL+numRow];
    この文でそのタッチしたviewId[numCol*COL+numRow]の値を取り出してfromIdに入れることができていないということです。

    キャンセル

  • 2017/01/27 16:25

    タッチしたとはなんですか?独自の単語を作らないでください。

    キャンセル

  • 2017/01/27 16:32

    実際に実機で動かしたときに、ある番号を押した時のviewIdやfromIdに押した番号がちゃんと入っているか確認したということです。

    キャンセル

  • 2017/01/27 17:51

    下記の値がそれぞれどうなっているか具体的な値を書いてください。
    ・fromId
    ・numCol*COL+numRow
    ・viewId[numCol*COL+numRow]

    キャンセル

  • 2017/01/27 18:10

    例えば12を押すと
    fromId=-1
    numCol=2,COL=4,numRow=4,

    viewIdに関しては”辞”というマークがついた方はviewId[numCol*COL+numRow]=12、
    1,2,3という行のようなマークがついた方はviewId={int[17]@20335}と出ました。

    キャンセル

  • 2017/01/27 19:34 編集

    その状態でfromId = viewId[numCol*COL+numRow]をしているんですよね?それなのに-1になるんですか?

    キャンセル

  • 2017/01/28 13:42

    コメント遅くなり申し訳ありません。
    その通りです(;_;)

    キャンセル

  • 2017/01/30 11:24

    昨日一昨日で色々考えてみて、
    case MotionEvent.ACTION_DOWN: {

    if(inViewBounds(findViewById(viewId[numCol*COL+numRow]), (int)event.getX(), (int)event.getY())){
    //今タッチした所
    fromCol = numCol+1;
    fromRow = numRow+0;
    int Id =numCol*COL+numRow;
    fromId = Id;
    Log.d("fromId", String.valueOf(fromId));
    }

    }
    このように一回Idという変数にnumCol*COL+numRowを入れてそれをfromIdに入れたらConsoleした時にfromIdに数字が入るようになりました。
    ただその代わりに上部のfromCol=numCol+1;,fromRow=numRow+0;は-1が入るようになってしまいましたが(:_;)
    これではだめでしょうか??

    キャンセル

  • 2017/01/30 11:49

    何が起きているかわからないのでダメかどうかわかりません。
    多分、値の確認方法が怪しいです。

    キャンセル

  • 2017/01/30 12:08

    すみません!!ブレークポイントのつけ方が悪くてうまく値が確認できていなかったことにたった今気づきました。
    改めて確認した所、
    fromCol = numCol+1;
    fromRow = numRow+0;
    fromId =viewId[numCol*COL+numRow];
    こちらにはしっかりと値が入っていることが確認できました!!

    キャンセル

  • 2017/01/30 12:42

    fromIdでfindViewByIdを行い、TextView#getTextを行なって値が正しいかを確認してください。

    キャンセル

  • 2017/01/30 13:06

    TextView textView = (TextView) findViewById(R.id.textview);
    int Id = findViewById(fromId);
    textView.getText(Id);
    このようにしたところ、Incompatible types Required:int Found:android.view.Viewと出てしまいました。
    恐らくint型のIdにView型が入っているということですよね??

    キャンセル

  • 2017/01/30 13:31

    TextView textView = (TextView) findViewById(R.id.textview);
    View Id = findViewById(fromId);
    textView.getText(Id);

    fromIdとIdの型が合わないということでIdをViewにしましたが今度は三行目のgetText(Id)にエラーが出てしまいました。

    キャンセル

  • 2017/01/30 14:57

    自分でまったく調べずに行き当たりばったりで作っていませんか?

    キャンセル

  • 2017/01/30 15:14

    私なりに調べて考えたつもりです、、
    view型のものをgetTextできないこともわかりましたが、fromIdをtextViewで表示する記述は文としてはこうではないのかなと考えた結果です(:_;)

    キャンセル

  • 2017/01/30 15:23

    メソッドの使い方に個人の解釈は必要ありません。リファレンスの使い方を理解して使ってください。

    キャンセル

  • 2017/01/30 15:26

    これは個人の解釈だったのでしょうか? getText()の使い方や例を見ながらやってみたのですが、、

    キャンセル

  • 2017/01/30 15:32

    そのサイトを載せてください。

    キャンセル

  • 2017/01/30 15:40

    https://anharu.keiji.io/lesson1/step7/こちらなどです。

    キャンセル

  • 2017/01/30 15:51

    サイトのやり方は正しいです。あなたのやり方はサイトの通りにやっていないので正しくないです。
    どこのgetTextに引数があるんですか?

    キャンセル

  • 2017/01/30 15:57

    すみません。
    調べたらgetText()の前に得たい値をつけるのですよね??
    そうすると
    TextView textView = (TextView) findViewById(R.id.textview);
    View Id = findViewById(fromId);
    Id.getText();
    このようになるのでしょうか?

    キャンセル

  • 2017/01/31 09:35

    続けて申し訳ありません。
    まだ解決できてないところで次の質問をするのは申し訳ない事は重々承知の上です。
    1つ気になったのですが、consoleをした際にACTION_DOWNは検知されているのですがACTION_MOVEが検知されません。
    調べたところそれぞれcase motionevent.ACTION_DOWNなどの最後にbreakをつけて1番最後にreturn trueを返すと出ていたのでやってみましたが、そうすると実機で実行した時に最初指で触れたfromIDしか検知されません。
    こちらについてはどうすればよいのでしょうか??

    キャンセル

  • 2017/01/31 10:31

    言葉足らずですみません。consoleをした際はじめ指でどれか番号を押すとACTION_DOWNと表示が出て、LogでfromId,fromCol,fromRowがしっかりと表示されます。その後ろにtoId,toRow,toColもLogで表示はされるのですが指で隣のマスにドラッグした時にACTION_MOVEと出ないということです。

    キャンセル

  • 2017/01/31 10:32

    toId,toRow,toColが出るということはACTION_MOVEの中はちゃんと動いているということだとは思いますが、のちのち入れ替えの際などに影響しないのかなと思い質問させていただきました。

    キャンセル

  • 2017/01/31 18:16

    しばらくの間色々なアドバイスありがとうございました。
    あの後色々と調べながら聞きながら取り組んだ結果無事に完成させることができました。
    色々と失礼な質問や不快な気分にさせてしまったことについて申し訳なく思います。
    本当にたくさんのアドバイスをありがとうございました。

    キャンセル

  • 2017/01/31 18:35

    力になれずごめんなさい。

    キャンセル

  • 2017/01/31 19:19

    とんでもないです!!yona様からのアドバイスが無ければ手も足も出せない状態でした。本当に感謝しています。ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • Java

    14473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3919questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • ドラッグ&ドロップ

    8questions

    コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。