3

Android: 画面の幅を取得して 3 で割りたいのですが、この長さを LayoutParams で使用したいのですが、うまくいきません。私は何を間違っていますか?// 1 でアプリがクラッシュします。

public class LoaderImageView extends LinearLayout {

private Context mContext;
private Drawable mDrawable;
private ProgressBar mSpinner;
private ImageView mImage;
Context ctx;
Display display;

public LoaderImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public LoaderImageView(Context context) {
    super(context);
    init(context);
}

/**
 * First time loading of the LoaderImageView
 * Sets up the LayoutParams of the view, you can change these to
 * get the required effects you want
 */
private void init(final Context context) {
    mContext = context;

//1. //これはアプリケーションのクラッシュです。ここから

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;

// ここまで

    mImage = new ImageView(mContext);
    mImage.setLayoutParams(new LayoutParams((width/3), 150));
    mImage.setVisibility(View.GONE);
    mImage.setBackgroundColor(Color.WHITE);
    mImage.setPadding(3, 3, 3, 3);



    mSpinner = new ProgressBar(mContext);
    mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    mSpinner.setIndeterminate(true);

    addView(mSpinner);
    addView(mImage);


}

/**
 * Set's the view's drawable, this uses the internet to retrieve the image
 * don't forget to add the correct permissions to your manifest
 * 
 * @param imageUrl the url of the image you wish to load
 */
public void setImageDrawable(final String imageUrl) {
    mDrawable = null;
    mSpinner.setVisibility(View.VISIBLE);
    mImage.setVisibility(View.GONE);
    new Thread() {
        public void run() {
            try {
                mDrawable = getDrawableFromUrl(imageUrl);
                imageLoadedHandler.sendEmptyMessage(RESULT_OK);
            } catch (MalformedURLException e) {
                imageLoadedHandler.sendEmptyMessage(RESULT_CANCELED);
            } catch (IOException e) {
                imageLoadedHandler.sendEmptyMessage(RESULT_CANCELED);
            }
        };
    }.start();
}

/**
 * Callback that is received once the image has been downloaded
 */
private final Handler imageLoadedHandler = new Handler(new Callback() {

    public boolean handleMessage(Message msg) {
        switch (msg.what) {
        case RESULT_OK:
            mImage.setImageDrawable(mDrawable);
            mImage.setVisibility(View.VISIBLE);
            mSpinner.setVisibility(View.GONE);
            break;
        case RESULT_CANCELED:
        default:
            // Could change image here to a 'failed' image
            // otherwise will just keep on spinning
            break;
        }
        return true;
    }
});

/**
 * Pass in an image url to get a drawable object
 * 
 * @return a drawable object
 * @throws IOException
 * @throws MalformedURLException
 */
private static Drawable getDrawableFromUrl(final String url) throws IOException, MalformedURLException {
    return Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "name");
}

}
4

4 に答える 4

2

ビューが作成された時点では、まだレイアウトにもウィンドウにもアタッチされていません。そのコードをに移動してみてくださいonAttachedToWindow

于 2012-05-15T19:31:41.643 に答える
2

getWindowManager()アクティビティの方法 にもかかわらず:http: //developer.android.com/reference/android/app/Activity.html#getWindowManager()

また、getSize()メソッドはAPIlivel13以降でのみ使用できます。

http://developer.android.com/reference/android/view/Display.html#getSize(android.graphics.Point

おそらくそれは良くありません、すべてのアンドロイドAPIバージョンの使用をカバーするために

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
于 2012-05-15T20:20:58.720 に答える
0

getWindowManager()は、Layoutクラスではなく、Activityで呼び出す必要があると思います。アクティビティで幅/高さを取得してから、それらの値(幅/高さ)を拡張線形レイアウトクラスに渡して使用してください。

于 2012-05-15T19:33:20.507 に答える
0

アクティビティに参加していない場合は、WINDOW_SERVICE を介してデフォルトのディスプレイを取得できます。

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

詳細はこちら..

于 2014-06-12T11:30:03.637 に答える