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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2079閲覧

xmlのデザインとViewクラスのonDrawのデザインの両立の仕方がわかりません

ko20vonobird

総合スコア50

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/04/14 09:54

編集2017/04/14 13:14

###前提・実現したいこと
こんにちは、タイトルの通りなのですが、xmlとカスタムビュー?を両立したいです。
詳細は下にあります。

###該当のソースコード

java

1FrameLayout fl = new FrameLayout(this); 2 this.setContentView(fl); 3 fl.addView(sc); 4 setContentView(R.layout.activity_game);

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.percent.PercentFrameLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:gravity="top"> 8 <com.gmail.archerygame.Game.Screen 9 android:id="@+id/sc" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 /> 13 <TextView 14 android:id="@+id/powertext" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:text="power" 18 app:layout_marginLeftPercent="25%" 19 /> 20 <TextView 21 android:id="@+id/staminatext" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="stamina" 25 app:layout_marginLeftPercent="25%" 26 app:layout_marginTopPercent="10%" 27 /> 28 <TextView 29 android:id="@+id/timer" 30 android:layout_width="10dp" 31 android:layout_height="10dp" 32 android:text="Timer" 33 android:layout_gravity="right" 34 /> 35 36</android.support.percent.PercentFrameLayout>

###発生している問題・エラーメッセージ
エラーメッセージはありません。
上記のコードのscはViewを継承したクラスなのですが、それを実装しようとしています。と同時にacrivity_game.xmlのデザインも導入しようとしています。そうするとどちらかしかセットできません。
両方セットする(重ねる)方法があれば教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

setContentViewはActivityのViewツリーを根こそぎ変更するメソッドです、画面についかするメソッドではありません。

方法は2つあります。
・Javaコードでレイアウトファイルの任意のViewGroupに対してaddViewを行う。
・レイアウトファイルでカスタムViewのタグを追加する。

投稿2017/04/14 10:39

yona

総合スコア18155

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

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

ko20vonobird

2017/04/14 10:59

回答ありがとうございます。後者について、xmlにscに関するタグを追加するということで合っていますか? また、検索したのですが具体的な方法が分からなかったので例を示していただいてもよろしいでしょうか? よろしくお願いします。
yona

2017/04/14 11:02

レイアウトファイルのxmlに<と入力し、コード補完を行なってください。
ko20vonobird

2017/04/14 11:33

xmlに<com.gmail.archerygame.Game.Screen 省略 />あるいは<View 省略 />を追加してみたのですが、前者の場合エラーが出て、後者の場合カスタムビュー?が表示されません。これは一体どうすればよいのでしょうか?
yona

2017/04/14 11:56

エラーが出るとはなんですか、 情報を具体的に書く癖をつけてください、やりとりの無駄です。 また、エラーが出た場合は調べてからコメントしてください。
ko20vonobird

2017/04/14 12:14

エラーのことは調べてから報告させていただきます。 ところで、世界中の人間がyonaさんのように完璧主義ではありません。そして、やり取りの無駄だと考えない場合もあります。貴方の価値観を押し付けるのはやめましょう。以前にも運営さんに通報させていただいておりますが、またこのように回答に準じないコメントが来るのは残念です。
yona

2017/04/14 12:44

あなたの通報に対して私には運営から連絡も来ていないようです。貴方の価値観は運営とは違うみたいですね。 また、私のコメントに書いてあるエラーの内容を書きましょうや調べましょうについてはヘルプに書いてある内容なのでそちらに文句を言ってください。この程度で完璧主義とは貴方の完璧のハードルは大分低いようですね。 「やりとりの無駄」については言葉がたりなさすぎましたね。ごめんなさい。 コメント欄で何度もやりとりするのは非効率なので、貴方が知っている内容を一度で提示してください。
yona

2017/04/14 12:54

おそらくコンストラクタがどうのというエラーだと思うのでカスタムViewにコンストラクタを増やしてください。
ko20vonobird

2017/04/14 12:59

それだけで相違があるというのはいささか疑問です。例え運営が通報を受けたとしても基準があるでしょうし、その上で連絡が来ないだけで私と運営さんの価値観が違うというのは余りにも短絡的な思考でしょう。 また、エラーの内容を書きましょう、調べましょうとあるとしても、初心者の私からすればこの膨大なエラーからどれが一番根底にあるもので調べるべきものかわかりません。そして同様にして書くのにも文字数制限などがあります。故に「エラー」とコメントが来てそういうことを想定できないのは貴方の落ち度でしょう。 完璧にも段階がありますから最初の完璧はこのぐらいのハードルで丁度良いと思います。初心者用の完璧というハードルは上級者のあなたからすれば低すぎましたか?しかしこれを煽るようなことは許されませんね。 分かりました。文字数制限内でできるだけ情報提供を致します。 Failed to read cpu-freq java.io.FileNotFoundException: /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state: open failed: ENOENT (No such file or directory) at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileInputStream.<init>(FileInputStream.java:76) at java.io.FileInputStream.<init>(FileInputStream.java:103) at java.io.FileReader.<init>(FileReader.java:66) at com.android.internal.os.KernelCpuSpeedReader.readDelta(KernelCpuSpeedReader.java:49) at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8002) at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61) at com.android.server.ServiceThread.run(ServiceThread.java:46) Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438) at java.io.FileInputStream.<init>(FileInputStream.java:76)  at java.io.FileInputStream.<init>(FileInputStream.java:103)  at java.io.FileReader.<init>(FileReader.java:66)  at com.android.internal.os.KernelCpuSpeedReader.readDelta(KernelCpuSpeedReader.java:49)  at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8002)  at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366)  at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.os.HandlerThread.run(HandlerThread.java:61)  at com.android.server.ServiceThread.run(ServiceThread.java:46)  04-14 09:58:52.021 1731-1751/system_process E/KernelUidCpuTimeReader: Failed to read uid_cputime java.io.FileNotFoundException: /proc/uid_cputime/show_uid_stat: open failed: ENOENT (No such file or directory) at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileInputStream.<init>(FileInputStream.java:76) at java.io.FileInputStream.<init>(FileInputStream.java:103) at java.io.FileReader.<init>(FileReader.java:66) at com.android.internal.os.KernelUidCpuTimeReader.readDelta(KernelUidCpuTimeReader.java:71) at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8031) at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61) at com.android.server.ServiceThread.run(ServiceThread.java:46) Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438)
ko20vonobird

2017/04/14 13:05

おそらくFileNotFoundExceptionが該当するエラーだと思います。違うかもしれませんが。
yona

2017/04/14 13:07 編集

あなたの推測通りです、 しかし、私の推測していたエラーではありませんでした。 ファイルを開くような処理はしていますか? あと、エラーが出た時のレイアウトファイルを質問に追記してください。
ko20vonobird

2017/04/14 13:15

質問に追記させていただきました。 ファイルを開くような処理というのはありません。
yona

2017/04/14 13:28

com.gmail.archerygame.Game.Screenがあなたの作ったクラスで、表示したいクラスですね? このクラスにContextとAttributeSetを引数にもつコンストラクタはありますか?無ければ定義してください。
ko20vonobird

2017/04/14 13:45

そうです。 Contextを引数にもつコンストラクタがあったので public Screen(Context context, AttributeSet attrs){ super(context, attrs); } としたところ、外側のActivityを継承するクラスで定義している Screen sc = new Screen(this);の(this)が赤波線になり実行することが出来ません。Screen (Context, AttributeSet) in Screen cannot be applied to (Game)とあります。
yona

2017/04/14 13:50

xmlで追加する方法をとるならJavaの方の記述は不要です。 また、Contextだけを引数にもつコンストラクタも定義しておけばいいですよ。
ko20vonobird

2017/04/14 14:28

Contextだけを引数にもつコンストラクタを定義したところ赤波線は無くなりました。ですが、実行したところ、 java.lang.RuntimeException: Unable to resume activity {com.gmail.archerygame/com.gmail.archerygame.Game}: java.lang.IllegalArgumentException: Cannot add a null child view to a ViewGroup というエラーが出ました。なので、sc = new...の記述を無くしてみたのですが、同様のエラーが発生しました。 エラーにはcannnot add a null child view...とあるのでnull即ち空っぽの子viewは追加できないということなのでしょうが、実際には中身なしなんてことはないのでどうしてこうなるのかが分かりません。
ko20vonobird

2017/04/14 14:59 編集

エラーで見落としていた部分がありました、 java.lang.RuntimeException: Unable to resume activity {com.gmail.archerygame/com.gmail.archerygame.Game}: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class com.gmail.archerygame.Game.Screen line 8なのでxmlファイルの<com.gmail.archerygame....の部分なのは分かるのですが、inflateは動的にレイアウトを挿入するということだと調べて出てきたのですが、それが失敗するという原因が考え出せませんでした。
yona

2017/04/14 16:26

inflateは動的にレイアウトを作成するメソッドです、挿入ではありません。 また、コンストラクタにバグがあると失敗します。
ko20vonobird

2017/04/15 06:36

カスタムビューを用いる場合のコンストラクタについて調べ、以下のようにコンストラクタを記述しました。 public Screen(Context context) { super(context, null); } public Screen(Context context, AttributeSet attrs) { super(context, attrs, R.layout.activity_game); } public Screen(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public Screen(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } 教わったものから段階的に増やしていってそれぞれで実行していったのですが、どれも前のコメントと同じline #8のエラーが出ます。
ko20vonobird

2017/04/15 08:06

ご報告いたします、エラーなしで表示させることが出来ました。 サイト http://www.appli-info.jp/archives/894さん の記事の通りにやってみたところうまくいきました。 別のJavaファイルを作り、そこにViewのところだけ書き、xmlにはそのクラスのタグを書き、表示させるJavaファイルにinflateと思われる作業をしました。 ですが、ここで一つ問題があります。タッチイベントなどに応じて違うファイルにあるビューを変更するにはどうすれば良いのでしょうか?(現在、Designgame.javaというファイルに例のView継承クラスの部分、Game.javaというファイルに表示する処理をした部分、と分かれているのです。)
yona

2017/04/15 09:24

内部のクラスとして定義していたんですね。 クラスの構成がわからない以上回答できません。 また、当初の質問とは異なるので別の質問として投稿してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問