2012-05-15 293 views
3

Android: 嘿,我想要回顾屏幕的宽度,并将其除以3.我想在LayoutParams中使用此长度,但它不起作用。我究竟做错了什么 ?该应用在// //崩溃。Android获取屏幕宽度

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"); 
} 

} 
+0

是否有不使用XML标记此任务一个很好的理由? – snowCrabs

回答

2

在视图中创建了点,但尚未连接到布局或窗口。尝试将该代码移至onAttachedToWindow

+0

很高兴知道。你每天学习新的东西。 – Gophermofur

0

我相信getWindowManager()需要在Activity上调用,而不是Layout类。尝试检索活动中的宽度/高度,然后将这些值(宽度/高度)传递到扩展的线性布局类中并使用它们。

2

尽管getWindowManager()是活动的方法: http://developer.android.com/reference/android/app/Activity.html#getWindowManager()

而且getSize()方法仅适用起始API livel 13

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

也许这是不好的,覆盖所有的Android API版本使用

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); // deprecated 
int height = display.getHeight(); // deprecated 
0

如果y ou're不是在一个活动,您可以通过WINDOW_SERVICE得到默认显示:

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

details here..