どもです。
訓練校の授業の方が、アプリ製作実習の段階になりました。
ということで早速。
FrameLayout上にImageViewをadd。
画像はassetsから持ってくる。
MainActivityではないクラスで。
MainActivityではないクラスで。(ここが重要)
//MainActivity
import android.app.*;
import android.os.*;
import android.widget.*;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout frameLayout = (FrameLayout)findViewById(R.id.framelayout);
Image image = new Image(this, frameLayout);
}
}
取り敢えず、MainActivityの方では好みのレイアウトを設定。
今回は複数の画像を重ねて一つの画像にすることが最終目標なので、FrameLayoutを選択。
重要なのは、画像の表示を行うクラスの引数。
imageView = new ImageView(this);
は、メインアクティビティの中でしかできないのがミソです。
メインアクティビティの中の「this」は、クラスのコンテキスト(クラスの様々な情報を含むもの)です。
コンテキストすべてを引数として引き渡します。
//Image
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.widget.*;
import java.io.*;
public class Image extends MainActivity {
ImageView imageView;
FrameLayout frameLayout;
Avatar(Context context, FrameLayout fl){
imageView = new ImageView(context);
frameLayout = fl;
AssetManager as = context.getResources().getAssets();
try {
InputStream is = as.open("sample2.png");
Bitmap bm = BitmapFactory.decodeStream(is);
imageView.setImageBitmap(bm);
frameLayout.addView(imageView);
} catch (IOException e) {
}
}
}
assetsから画像を読み込む方法については、今回はシンプルなこちらのコードを使用させて貰っています。
アンドロイドアプリ開発TIP★STAR
さきほども書きましたが、今回のミソは、
imageView = new ImageView(this);
が、できない。ここに尽きます。
ついでにいえば、同じ理由で、
AssetManager as = getResources().getAssets();
もできません。
どちらも、参照したいコンテキスト情報がMainActivity内にしか存在しないためです。
そこで、MainActivityからコンテキストを引数として戴きます。
これにより、
imageView = new ImageView(context);
AssetManager as = context.getResources().getAssets();
という形で、それぞれ処理することができます。コロンビア。