🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

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

Q&A

解決済

2回答

4571閲覧

Android Studio においてView座標の設定がうまくできません【初心者】

takusuke

総合スコア16

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/12/14 04:00

「test」と書いてあるTextViewを長押しすると、移動可能となるようなプログラムを作成しました。実現したいことは、そのViewを移動させた後に、画面遷移をし、再び戻ってきたときにViewの位置が保持されることです。いろいろ自分なりに調べてプログラムを書いてみたのですが上手くいきません泣
どなたか助けていただきたいです、、、

コードは膨大にあるため、該当箇所のみ抜粋して載せます。

SubActivity3java

1import ・・・ 2public class SubActivity3 extends AppCompatActivity 3 implements View.OnTouchListener { 4 private int dx; 5 private int dy; 6 private int read_x, read_y 7 private SharedPreferences prefsx, prefsy; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_sub3); 13 14 cImageView = this.findViewById(R.id.ch_textView1); 15 cImageView.setOnTouchListener(this); 16 17 prefsx = getSharedPreferences("x_zahyou", MODE_PRIVATE); 18 prefsy = getSharedPreferences("y_zahyou", MODE_PRIVATE); 19 20 read_x = prefsx.getInt("x", 0); 21 read_y = prefsy.getInt("y", 0); 22 23 cImageView.setTranslationX(read_x); 24 cImageView.setTranslationY(read_y); 25 26 27(省略) 28 29 @Override 30 public boolean onTouch(View v, MotionEvent event) { 31 // x,y 位置取得 32 int newbuttonX = (int)event.getRawX(); 33 int newbuttonY = (int)event.getRawY(); 34 35 switch (event.getAction()) { 36 // タッチダウンでdragされた 37 case MotionEvent.ACTION_MOVE: 38 // ACTION_MOVEでの位置 39 // performCheckを入れろと警告が出るので 40 v.performClick(); 41 42 x = (newbuttonX - buttonX); 43 y = (newbuttonY - buttonY); 44 45 dx = cImageView.getLeft() + x; 46 dy = cImageView.getTop() + y; 47 48 imgW = dx + cImageView.getWidth(); 49 imgH = dy + cImageView.getHeight(); 50 51 // Viewの位置を設定する 52 cImageView.layout(dx, dy, imgW, imgH); 53 break; 54 case MotionEvent.ACTION_DOWN: 55 break; 56 case MotionEvent.ACTION_UP: 57 break; 58 default: 59 break; 60 } 61 62 //編集文字列のxmlファイル書き出し 63 editor = prefsx.edit(); 64 editor.putInt("x", dx); 65 editor.apply(); 66 67 read_x = prefsx.getInt("x", 0); 68 69 //編集文字列のxmlファイル書き出し 70 editor = prefsy.edit(); 71 editor.putInt("y", dy); 72 editor.apply(); 73 74 read_y = prefsy.getInt("y", 0); 75 76 // タッチした位置を古い位置とする 77 buttonX = newbuttonX; 78 buttonY = newbuttonY; 79 80 return true; 81 } 82} 83

activitysub3xml

1<?xml version="1.0" encoding="utf-8"?> 2 3<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:id="@+id/ConstraintLayout" 7 android:layout_width="match_parent" 8 android:layout_height="match_parent" 9 android:background="#96e6e6" 10 tools:context=".MainActivity"> 11 12 13(省略) 14 15 16 <com.example.tokoroshingo.myapplication.CustomImageView 17 android:id="@+id/ch_textView1" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:layout_marginStart="16dp" 21 android:layout_marginLeft="16dp" 22 android:layout_marginTop="8dp" 23 android:text="test" 24 app:layout_constraintStart_toStartOf="parent" 25 app:layout_constraintTop_toTopOf="parent" /> 26 27</android.support.constraint.ConstraintLayout> 28

実行結果

この位置にViewがあり、これを
1
以下の位置にドラッグして持っていきます。(ボタンの動きは無視してください汗)
2
そして、returnボタンで前の画面に遷移してもう一度この画面に戻ると、2枚目の位置にViewがきて欲しいのに、ずれてしまいます(おそらく初期位置から1枚目→2枚目のView座標の差が足されているかのように見えます)
3
(参考資料:初期位置)
4

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/12/14 04:46

コードを囲む ``` の右側には, ファイル名では無く言語名(java,xml等)をお書きください. ファイル名は, 内部のコードにその言語のコメントとして書くか, コードの枠外にご記入ください.
guest

回答2

0

一部抜粋のようなので的外れな回答かもしれませんが、
SubActivity3が起動するたびにPreferencesデータから座標を読出ししています
ACTION_UP時に座標の保存が行われていないようなので
Preferencesへ保存するようにしてみてください

投稿2019/12/14 05:21

HRSKT

総合スコア168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takusuke

2019/12/16 03:29

回答ありがとうございます。 タッチイベントのSwitch文の終わりに保存をしているので、座標が保存されているのではないのですかね・・・?理解力なくてすみません、、 また、getX() を使用して自己解決しました汗 ありがとうございました。
guest

0

ベストアンサー

cImageView.setTranslationX/Y に渡すべき値はどんな座標でしょう.
そして, SharedPreferences に保存しているのはどんな値でしょう.
それを確認すれば自ずと分かるかと思います.

投稿2019/12/14 04:49

編集2019/12/14 04:51
jimbe

総合スコア13204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takusuke

2019/12/16 03:30

回答ありがとうございます。 参考にさせて頂き、getX()などの関数を使用し解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問