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

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

ただいまの
回答率

88.91%

内包されているクラスから、外側のクラスのある定数の値を使いたいです

解決済

回答 1

投稿 編集

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

ko20vonobird

score 50

実現したいこと

タイトルの通りなのですが、アクティビティを継承しているクラスの中にビューを継承しているクラスがあり、そのクラスから外側のクラスで測った画面の幅の定数を取得したいのです。

発生している問題

なぜか値が0になります。また、下記の試したことで書いたようにインスタンスを作成してインスタンス.定数;としてみたのですが、うまくいきませんでした。

該当のソースコード

全文

package com.gmail.archerygame;

//import ゾーン

public class Main extends Activity {
    //コンストラクタ的ゾーン
    private TextView title;
    private int winWM, winHM;
    private int winWMl, winHMl;
    private int a, r, g, b, cnt;
    private int sw = 0;
    private double kaku;
    private float titley;
    private float titleh;
    private int deltay;
    private double rad;
    private Handler mHandler;
    private Runnable titleloop;
    private Handler stHandler = new Handler();
    private Runnable st;
    private Handler cbHandler;
    private Runnable circlebreaking;
    private Handler cbrunHandler = new Handler();
    private Runnable circlemake;
    Ct cta;
    float s = 37.0f;
    public int getWinWM(){//##########
        return winWM;
    }
    public int getWinHM(){//##########
        return winHM;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //setContentView(R.layout.activity_main);
        //ステータスバー非表示
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //タイトルバー非表示
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
    public void  onResume() {
        super.onResume();
        if (mHandler != null){
            mHandler.postDelayed(titleloop, 1000);
        }
        if (stHandler != null){
            stHandler.postDelayed(st, 1000);
        }
        if (cbHandler != null){
            cbHandler.postDelayed(circlebreaking, 1000);
        }
        if (cbrunHandler != null){
            cbrunHandler.postDelayed(circlemake, 1000);
        }
        cta = new Ct(this);
        parts();
    }
    public void parts() {
        WindowManager wmM = (WindowManager)getSystemService(WINDOW_SERVICE);
        Display dpM = wmM.getDefaultDisplay();
        Point poM = new Point();
        dpM.getSize(poM);
        winWM = poM.x;
        winHM = poM.y;
        FrameLayout fl = new FrameLayout(this);
        this.setContentView(fl);
        fl.addView(cta);
        final LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        fl.addView(ll);
        title = new TextView(this);
        title.setText("N!ce・Sl!ngshot");
        title.setTextSize(17.0f);
        title.setTypeface(Typeface.SERIF);
        float titlewidth = title.getCompoundPaddingLeft() + title.getCompoundPaddingRight() + Layout.getDesiredWidth(title.getText(),title.getPaint());
        float titlemiddle = titlewidth;
        int titlewhere = (int)((winWM / 2) - (titlemiddle / 2));
        float titlewheref = (float)titlewhere;
        title.setTranslationX(titlewheref);
        ll.addView(title);
        title.setVisibility(View.GONE);
        st = new Runnable() {
            @Override
            public void run() {
                stHandler.removeCallbacks(st);
                looper();
            }
        };
        stHandler.postDelayed(st, 3000);
    }
    public void looper() {
        WindowManager wmMl = (WindowManager)getSystemService(WINDOW_SERVICE);
        Display dpMl = wmMl.getDefaultDisplay();
        Point poMl = new Point();
        dpMl.getSize(poMl);
        final int winWMl = poMl.x;
        final int winHMl = poMl.y;
        mHandler = new Handler();
        a = 35;
        r = 0;
        g = 0;
        b = 0;
        cnt = 0;
        kaku = 0;
        titley = winWMl - titleh;
        titleloop = new Runnable() {
            @Override
            public void run() {
                title.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                titleh = title.getCompoundPaddingTop() + title.getCompoundPaddingBottom() + title.getMeasuredHeight();
                float titlewidthcb = title.getCompoundPaddingLeft() + title.getCompoundPaddingRight() + Layout.getDesiredWidth(title.getText(),title.getPaint());
                float titlewherecb = (winWMl / 2) - (titlewidthcb / 2);
                title.setTranslationX(titlewherecb);
                title.setTranslationY(titley);
                title.setTypeface(Typeface.SERIF);
                switch(title.getVisibility()){
                    case View.VISIBLE:
                        break;
                    case View.GONE:
                        title.setVisibility(View.VISIBLE);
                        break;
                }
                s = s + 0.4f;
                kaku = -1 * cnt * 7.2;
                rad = kaku * Math.PI / 180;
                int deltay = (int)(winHMl * Math.sin(rad));
                titley = winHMl + deltay;
                title.setTextSize(s);
                title.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                titleh = title.getCompoundPaddingTop() + title.getCompoundPaddingBottom() + title.getMeasuredHeight();
                float titlewidthc = title.getCompoundPaddingLeft() + title.getCompoundPaddingRight() + Layout.getDesiredWidth(title.getText(),title.getPaint());
                float titlewherec = (winWMl / 2) - (titlewidthc / 2);
                title.setTranslationX(titlewherec);
                title.setTranslationY(titley);
                if (titley + titleh > winHMl) {
                    titley = winHMl - titleh;
                    title.setTranslationY(titley);
                }
                title.setTypeface(Typeface.SERIF);
                title.setTextColor(Color.argb(a, r, g, b));
                a = a + 4;
                mHandler.postDelayed(titleloop, 15);
                if (s >= 59.0f) {
                    mHandler.removeCallbacks(titleloop);
                    //次のまで数秒のハンドラ作成
                    cbHandler = new Handler();
                    circlebreaking = new Runnable() {
                        @Override
                        public void run() {
                            cb();
                        }
                    };
                    cbHandler.postDelayed(circlebreaking, 1500);
                }
                cnt = cnt + 1;
            }
        };
        mHandler.postDelayed(titleloop, 15);
    }
    public void cb() {
        cbHandler.removeCallbacks(circlebreaking);
        Paint cipa = new Paint();
        circlemake = new Runnable() {
            @Override
            public void run() {
                //円のアニメーション描画
                sw = 1;
                cta.endraw();
                cbrunHandler.removeCallbacks(circlemake);
            }
        };
        cbrunHandler.postDelayed(circlemake, 15);
    }
    public class Ct extends View {
        float gw = getWinWM();//##########
        float gh = getWinHM();//##########
        private float r1 = gw + 20;
        private float cx = gw / 2;
        private float cy = (gh / 2) - (gh / 6);
        public Ct(Context context){
            super(context);
        }
        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);
            Paint pam = new Paint();
            if (sw == 1){
                //ここにすべての処理を書いていく↓
                pam.setColor(Color.argb(255, 0, 0, 0));
                pam.setStyle(Paint.Style.STROKE);
                pam.setStrokeWidth(3);
                canvas.drawCircle(cx, cy, r1, pam);
                //ここにすべての処理を書いていく↑
            }
        }
        public void endraw(){
            invalidate();
        }
    }
    public void onPause() {
        super.onPause();
        if (mHandler != null){
            mHandler.removeCallbacks(titleloop);
        }
        if (stHandler != null){
            stHandler.removeCallbacks(st);
        }
        if (cbHandler != null){
            cbHandler.removeCallbacks(circlebreaking);
        }
        if (cbrunHandler != null) {
            cbrunHandler.removeCallbacks(circlemake);
        }
    }
    public void onDestroy() {
        super.onDestroy();
        if (mHandler != null){
            mHandler.removeCallbacks(titleloop);
        }
        if (stHandler != null){
            stHandler.removeCallbacks(st);
        }
        if (cbHandler != null){
            cbHandler.removeCallbacks(circlebreaking);
        }
        if (cbrunHandler != null){
            cbrunHandler.removeCallbacks(circlemake);
        }
    }
}


問題個所に//##########を付けました。

試したこと

デバッグして値を確かめたり、外側のクラスのインスタンスを作成してそれを用いて参照できないか試みました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

なぜかというと、onCreateが実行されたMainとあなたがnewしたMainは別のインスタンスだからです。
Activityを継承したクラスはOSがインスタンス化するもので、プログラマがインスタンス化するものではありません。

Mainクラスにプライベート変数へのアクセッサメソッドを定義しましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/23 01:18

    私はteratailをその辺の力を鍛えるために利用しています。

    onPauseで行った確認は4の証明です。ここで正しい値が取得できないならそもそもの取得方法が間違っている、または取得したがその後0に再設定されているという事になります。しかし正しい値が取得できたので、ある程度推測が正しいと考えられます。

    7についてはpartsメソッドの中でwinWMが初期化されているのでこのメソッド以降は正しい値が設定されますが、それ以前は0です。

    8についてはとりあえずCtのインスタンス化とpartメソッドの処理順を入れ替えて見てください。

    フィールド変数の初期化は一度のみです、変更されたらその都度更新する必要があります。

    キャンセル

  • 2017/01/23 01:59

    私も思考力?を鍛えられるように努力していこうと思います。ただ、一つ不安でもあるのが、自分の思考が遅いがために相手の時間まで割いてしまっていいのかというものです。

    4については0に再設定されているわけでもないですよね?アクセッサメソッドを使って得た値は0ではなかったので。

    7について、初期化されることで正しい値が取得できるようになるのですよね?

    なるほど、てっきり他の言語と混同していました。

    キャンセル

  • 2017/01/23 02:03

    ようやく解決しました。どう変えたかというと、Ctクラスにて初期化する際に数値などまで設定していましたが、どう考えたのかまでは忘れましたがそれをやめて、宣言だけにして、ゲッターと共に初期化部分?をonDrawの中に入れたところちゃんと作動するようになりました。
    これでひとまずといったところなのですが、onDrawは頻繁に呼び出されると教えてもらったことがあり、ここに初期化?の部分を置いて良いのかが未だ疑問です。もし、こうした方がいいというのがあれば教えていただけると幸いです。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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