• ベストアンサー

Androidアプリ EditText表示

main.xmlにGUIで作成したEditTextを、Canvasクラスを通じて表示させる方法はあるのでしょうか? Canvasクラス内にfindViewByIdで読み出してくるよう記述しましたが、実行しても反映されず困っております。 protected void onDraw(Canvas canvas) { (ここに記述) } ちなみに、テキストの描写は問題無く反映できます。 canvas.drawText(text, 4, 0, paint); よろしくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.1

CanvasはViewではありません。Androidでは、基本的にViewクラスを画面に組み込み、その中にコンポーネントを配置します。各種のLayoutも、Viewを継承し作成されています。が、CanvasはViewを継承しておらず、Objectを継承して作られています。すなわち、ビューやレイアウトではないのです。従って、コンポーネントを組み込むことはできません。 Canvasというのは、抽象化されたグラフィックコンテキストであり、これ自体は画面に組み込むようなコンポーネントとは全く性質の異なるものです。「Canvasクラス内にfindViewByIdで読み出してくるよう記述しました」とありますが、そもそもCanvasクラスをプログラマが定義するということは想像ができません。どこか勘違いをされているように思えます。(ちなみに、onDrawメソッドはCanvasクラス内にはありません。何かのViewクラス内にあるのではないですか?)

gongen123
質問者

お礼

ありがとうございます。記述箇所を変えるとうまく描写できました。

関連するQ&A

  • Androidアプリ開発

    Androidアプリを開発しているのですが、 エミュレータ、実機ともに実行するとプログラムが反映されておりません。 以下のソースを実行すると、 「Hello World!」のみ表示されます。 原因がわからないので、ご教授願えませんでしょうか。 【ソース】 package sib.stringex; import android.app.Activity; import android.os.Bundle; import android.view.Window; public class StringEx extends Activity{ @Override public void onCreate(Bundle bundle){ super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new StringView(this)); } } package sib.stringex; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class StringView extends View { public StringView(Context context){ super(context); setBackgroundColor(Color.WHITE); } @Override protected void onDraw(Canvas canvas){ Paint paint= new Paint(); paint.setAntiAlias(true); paint.setTextSize(24); paint.setColor(Color.rgb(0, 0, 0)); canvas.drawText("画面サイズ:"+ getWidth()+ "X"+getHeight(), 0, 60, paint); canvas.drawText("文字幅:"+(int)paint.measureText("A"), 0, 60*2, paint); canvas.drawText("アセント"+(int)paint.ascent(), 0, 60*3, paint); canvas.drawText("ディセント"+(int)paint.descent(), 0, 60*4, paint); paint.setTextSize(24); paint.setColor(Color.rgb(255, 0, 0)); canvas.drawText("24dot", 0, 60*5, paint); paint.setTextSize(32); paint.setColor(Color.rgb(0, 255, 0)); canvas.drawText("32dot", 0, 60*6, paint); paint.setTextSize(48); paint.setColor(Color.rgb(0, 0, 255)); canvas.drawText("32dot", 0, 60*7, paint); } }

  • アンドロイド JAVA 警告

    アンドロイド 初心者です package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new testView(this)); } class testView extends View { public testView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(0, 0, 100, 50, paint); } } } このプラグラムで"Paint paint = new Paint();"のところで "Avoid object allocations during draw/layout operations (preallocate and reuse instead)" の警告が出ます、これを取る方法はありませんか。

    • ベストアンサー
    • Java
  • drawとonDrawの使い分け

    public void draw(Canvas canvas) とpublic void onDraw(Canvas canvas) の違いは何でしょうか? 試しに二つ設定してみるとonDrawが呼ばれてからdrawが呼ばれます。 どういう使い分けなのでしょうか? 下記をgoogle翻訳して読みましたがいまいち解りませんでした。 https://stackoverflow.com/questions/13640541/view-ondrawcanvas-c-versus-drawcanvas-c-in-android どちらも自動的に呼ばれるようですが、どのような目的の違いがあるのでしょうか?

  • Androidアプリ実行エラー2

    Androidアプリ実行エラー ソースはこちらです。 package com.example.sudoku; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.Style; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.animation.AnimationUtils; public class PuzzleView extends View { private static final String TAG = "Sudoku"; private float width; private float height; private int selX; private int selY; private final Rect selRect = new Rect(); private final Game game; public PuzzleView(Context context) { super(context); this.game = (Game) context; setFocusable(true); setFocusableInTouchMode(true); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { width = w / 9f; height = h / 9f; getRect(selX, selY, selRect); Log.d(TAG, "onSizeChanged: width " + width + ", height" + height); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { //背景色の描画 Paint background = new Paint(); background.setColor(getResources().getColor( R.color.puzzle_background)); canvas.drawRect(0, 0, getWidth(), getHeight(), background); //盤面を描画する //枠線の色を定義する Paint dark = new Paint(); dark.setColor(getResources().getColor(R.color.puzzle_dark)); Paint hilite = new Paint(); hilite.setColor(getResources().getColor(R.color.puzzle_hilite)); Paint light = new Paint(); light.setColor(getResources().getColor(R.color.puzzle_light)); //マス目を区切る線 for (int i = 0; i < 9; i++) { canvas.drawLine(0, i * height, getWidth(), i * height, light); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), light); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } //3*3を区切る線 for (int i = 0; i < 9; i++) { if(i % 3 != 0) continue; canvas.drawLine(0, i * height, getWidth(), i * height, dark); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), dark); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } //数値を描画する Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG); foreground.setColor(getResources().getColor(R.color.puzzle_foreground)); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); //マスの中央に数字を描く FontMetrics fm = foreground.getFontMetrics(); //x軸方向でセンタリングする。中央のx座標に揃える float x = width / 2; // float y = height / 2 - (fm.ascent + fm.descent) / 2; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { canvas.drawText(this.game.getTileString(i, j),i * width + x, j * height + y, foreground); } } //ヒントを描画する //選択されたマスを描画する } private void getRect(int x, int y, Rect rect) { rect.set((int) (x * width), (int) (y * height), (int) (x * width + width), (int) (y * height + height)); } } ログはこちらです。 ご回答をよろしくお願いします。 http://okwave.jp/qa/q8272113.html

  • [android]画面に円が表示されない原因

    こんにちは。 以下のサイトを参考に白い画面に赤い円を表示させたいのですが、実際にはエミュレータ上に表示されません。 logcatのエラーもありません。原因と対処方法をご教授ください。 eclipseのバージョンは以下のとおりです。 Eclipse Platform 3.8.0.v20120607-071945-9gF7jI7nG5qByXMVdkhRMWBQlF4PnDCLybDCPQ http://www.hakkaku.net/articles/20091127-594 ★MainActivity.java package com.example.test001_001; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 描画クラスを設定 setContentView(new TestDrawView(getApplication())); } /* 描画用クラス */ class TestDrawView extends View { public TestDrawView(Context c) { super(c); } } // このメソッドで描画を行う protected void onDraw(Canvas c) { // --------- (*1)Check!! c.drawColor(Color.WHITE); Paint p = new Paint(); p.setColor(Color.RED); p.setStyle(Paint.Style.FILL); c.drawCircle(100, 100, 50, p); } }

  • androidの円(circle)を連続で出したい

    android初心者です。 androidの円(circle)を連続で出したいソースを作成していますがうまくいきません。 現在のソースではランダムで座標を取得することは出来ますが表示されません。 for文for(i=0;i<100;i++)で作成してみましたが、100回終わるまで円が表示されません。 以下が自分で作成してみたソースです。 どなたか詳しい方教えてください。 public class Balltataki extends Activity { int ran_width; int ran_height; Paint paint; boolean running=true; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(new BallView(this)); class BallView extends View { int flag=1; public BallView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { while(running==true){ ran_width = (int)(Math.random()*getWidth()); ran_height = (int)(Math.random()*getHeight()); Log.i("tag","ran_w:"+ran_width); Log.i("tag","ran_h:"+ran_height); paint=new Paint(); paint.setAntiAlias(true); paint.setStrokeWidth(1); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.argb(255, 255, 255, 255)); canvas.drawCircle(ran_width,ran_height,60,paint); try { Thread.sleep(100); } catch (Exception e) {} } } } }

  • EditTextからフォーカスを外す処理

    Androidのプログラミングで、EditText(入力widget)をExcelのセルのように5つ並べて計算させる画面があります。 XML上のEditTextは5つあり、下記はボタン[btnUpdate]をクリックしたとき、5つめのEditTextにフォーカスが1度あたる(カーソルが入る)ようになっています。 EditText editText5 = (EditText)findViewById(R.id.editText5); editText5.setOnFocusChangeListener(this); Button btnUpdate = (TextView)findViewById(R.id.btnUpdate); btnUpdate.setOnClickListener(this); btnUpdate.setOnFocusChangeListener(this); //以下、メソッド部 ==========================/ @Override public void onClick(View v) { if(v == btnUpdate) { editText5.requestFocus(); // EditText5にフォーカスをあてる    (EditText同士の計算処理) //* ここにフォーカスが外れる記述をしたい */ } } カーソルがeditText5に入った状態(フォーカスがあたったまま)になると、editText1~5の数字が計算されるようになっています。 カーソルが点滅した状態で処理が終わるのですが、処理後はカーソル点滅をやめたいので、editTextからフォーカスをはずしたいと思っています。 質問:カーソルが消える(処理後フォーカスがすべてのEditTextから外れる)状態にする記述(requestFocus();の逆のメソッド)がわかりません。 よろしくお願いします。

  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  JAVA初心者です、宜しくお願いします。  下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で 「Canvasから継承されたメソッドの可視性を下げることは出来ません。」 とのエラーメッセジが出ました。  "public void paint(Graphics g)"とかくと、エラーは消えました。  何故"public"をつける必要があるのでしょうか。  また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが  メッソドにはこのようなルールはないのでしょうか。 ======================================= public class Canvas_test extends Canvas { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Canvas_test"); frame.setBounds(0,0,480,380); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLayout(null); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); cp.setBounds(38,20,400,300); Canvas canvas = new Canvas_test(); cp.add(canvas); canvas.setBounds(0,0,400,300); frame.setVisible(true); } void paint(Graphics g) { g.drawString("aaaa",40,40); } } ========================================

    • ベストアンサー
    • Java
  • EditText型をint型に変換し通貨表示に

    ■やりたいこと: AndroidのEditTextに、ユーザがインプットメソッドを用いて数字を入力した際、その値を 1. int型変数と、String型変数に代入(2つの型で、後々使えるよう変数内にデータ保持したい) 2. EditText(スマホ画面)には、入力後「通貨」書式で表示したい 「通貨」書式とは、EditTextに「1000と入力したら、1,000」のように、位取りして表示をしたいという意味です。 下記コードだと、アプリが起動直後に落ちてしまいます。 実行後に表示されるLogCatには「FATAL EXCEPTION」と書かれています。 ■レイアウト(xml:activity_main) <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number"//画面から数値のみ:入力制限 android:digits="0123456789"/> ■クラスファイル public class MainActivity extends Activity implements OnFocusChangeListener { EditText editText; String str; String str2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //editText1=layoutのEditTextのid EditText editText = (EditText)findViewById(R.id.editText1); editText.setOnFocusChangeListener(this); str = editText.getText().toString(); //EditTextに入力された数字を取得 int i = Integer.parseInt(str); //Integerクラスの値=整数値を取得★ NumberFormat numFormat = NumberFormat.getCurrencyInstance(); //通貨フォーマット str2 = numFormat.format(i); //整数値を通貨フォーマットに } @Override public void onFocusChange(View arg0, boolean getFocus) { if (getFocus){ editText.setText(str2); //EditTextにセット(表示) } } } ==================================================================== 原因は「★」の部分のようです。ここを通過するととデバッガが落ちます。 (EditTextに半角数字を入れても、それがint型の保証がないからでしょうか) 上の「やりたいこと」を実現するには、どこを修正すればよいでしょうか。

  • iアプリ Display#setCurrent使用での画面ちらつき

    こんにちは。 iアプリを作っています。 トップメニュー、サブメニューがあり、1Canvas画面で処理するのが しんどかったので機能毎のCanvasを継承したクラスを作りました。 そのクラスをIApplicationを継承したクラス内のメソッドで Display.setCurrent()を実行して画面を切り替えていますが 切り替え時に画面がちらつきます。 どうにかちらつくことの回避方法はありませんでしょうか。 簡略したソース public class AppliMain extends IApplication {  ACanvas aCanvas = null;  BCanvas bCanvas = null;  public void start () {   aCanvas = new ACanvas ( this );   bCanvas = new BCanvas ( this );   this.showACanvas ();  }  public void showACanvas () {   Display.setCurrent ( aCanvas );  }  public void showBCanvas () {   Display.setCurrent ( bCanvas );  } } public class ACanvas extends Canvas {  private AppliMain parent = null;  public ACanvas ( AppliMain _parent ) {   parent = _parent;  }  public void paint ( Graphics g ) {  }  public void processEvent ( int type, int param ) {   // BCanvasに表示切替   parent.showBCanvas();  } } public class BCanvas extends Canvas {  private AppliMain parent = null;  public BCanvas ( AppliMain _parent ) {   parent = _parent;  }  public void paint ( Graphics g ) {  }  public void processEvent ( int type, int param ) {   // ACanvasに表示切替   parent.showACanvas();  } }

    • ベストアンサー
    • Java

専門家に質問してみよう