画像ボタンビューに添付されたontouchlistner内から画像ボタンビュー(appcompatimagebutton)でgetDrawingCache()が返される理由を理解してください。レイアウト後にgetDrawingCache()がnullを返す
主に、この問題を解決しようとする中で、私はこの質問を参照されました:私の問題を解決していない
Android View.getDrawingCache returns null, only null
。私は何かを見落としているか、何かを完全に理解していないと確信しています。それが何であるか把握してください。
注:
1)実際のプロジェクトで、私はそれがのImageButtonがないことを提供しています機能)を必要とするので、私はのImageButtonまたはAppCompatImageButtonを使用します(しかし、私はAPPCOMPAT使用しています何の違いの天気をしないように思われます。
2)ユーザーがontouch()を起動したときにレイアウトが既に描画されているため、ビューのメジャーとレイアウトメソッドを呼び出す必要があるのはわかりませんが、とにかく私が見つけた多くの答えは、これが必要であることを示しているようでした。私もそれらを取り除くとうまくいきません。
3)setEnableDrawingCacheおよびbuildDrawingCache呼び出しをonTouchに配置するか、またはAppCompatImageButtonビューの初期化を使用してonCreateを呼び出すかは関係ありません。どちらの場合でも、画像ボタンビューのgetDrawingCacheへのontouchlistener呼び出しはnullを返します。ここ
は、コードサンプルは、
感謝です!
public class MainActivity extends AppCompatActivity {
AppCompatImageButton mImageButton;
Bitmap mBitmapDrawingCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//create image button
mImageButton = new AppCompatImageButton(this);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(270, 270);
mImageButton.setLayoutParams(layoutParams);
//getDrawingCache() in ontouchlistener returns null regardless if this is set
int mseWidth = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY);
int mseHeight = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY);
mImageButton.measure(mseWidth, mseHeight);
mImageButton.layout(0, 0, 270, 270);
/* this does not work either
int mseWidth = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int mseHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mImageButton.measure(mseWidth, mseHeight);
mImageButton.layout(0, 0, mImageButton.getMeasuredWidth(), mImageButton.getMeasuredHeight());
*/
//getDrawingCache() in ontouchlistner returns null regardless if either, both or none of these are set
//mImageButton.buildDrawingCache();
mImageButton.setDrawingCacheEnabled(true);
//attach image button view to content view
((FrameLayout) findViewById(android.R.id.content)).addView(mImageButton);
//set touch listener
mImageButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//why is this line returning null instead of a Bitmap ?
mBitmapDrawingCache = Bitmap.createBitmap(v.getDrawingCache());
Log.d("TAG_A", mBitmapDrawingCache.toString());
return false;
}
});
}
}
ご返信ありがとうございます。これらの通話をonClickに配置することは、私の設計にとって好ましくありません。私がそれをテストするときにonTouchにそれらの呼び出しを置くことは私のために働かない。これが他の人のために働いているのであれば、テストしているハードウェアに特有のものがないのだろうか?これはいくつかのデバイスで動作し、他のデバイスでは動作しない可能性がありますか? – dl77sea