2013-04-03 27 views
4

我創建我的看法編程,根本沒有XML和需要我的工作在該地區的實際大小我一直在使用這個代碼:機器人如何得到高度和寬度onCreateView

public static class DummySectionFragment extends Fragment { 
    @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

       if (container == null) { 
        return null; 
       } 

       Context context = getActivity(); 
       int tabNo = getArguments().getInt(ARG_SECTION_NUMBER); 
       Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

       // check display size to figure out what image resolution will be loaded 
       DisplayMetrics metrics = new DisplayMetrics(); 
       display.getMetrics(metrics); 

       Point size = new Point(); 
       display.getRealSize(size); 
       display.getSize(size); 
       int width = size.x; 
       int height = size.y; 

但這並沒有考慮到所有其他'裝飾'像標題欄和導航欄

該文檔說不使用顯示度量來獲得大小,但我怎麼能找出大小的視圖在onCreateView?我試過container.getHeight()但返回0

我想問題是視圖尚未創建,但必須有一個父視圖onCreateView,知道有多大的視圖是正確的?

我該如何找到?

感謝

FYI,這個工程:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    if (container == null) { 
     return null; 
    } 

    Context context = getActivity(); 
    int tabNo = getArguments().getInt(ARG_SECTION_NUMBER); 
    Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    // check display size to figure out what image resolution will be loaded 
    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    Point size = new Point(); 
    display.getRealSize(size); 
    display.getSize(size); 
    int width = size.x; 
    int height = size.y; 

    switch (metrics.densityDpi) { 
     case DisplayMetrics.DENSITY_XXHIGH:  height -= 72;  break; 
     case DisplayMetrics.DENSITY_XHIGH:  height -= 64;  break; 
     case DisplayMetrics.DENSITY_HIGH:  height -= 48;  break; 
     case DisplayMetrics.DENSITY_MEDIUM:  height -= 32;  break; 
     case DisplayMetrics.DENSITY_LOW:  height -= 24;  break; 
     default: 
      Log.e("onCreateView", "Unknown density"); 
     } 
    } 

,但它似乎並不像一個乾淨的方式來做到這一點。我猜到了xhigh和xxhigh,我還沒有找到實際的數字卻

此外,我要補充一點,視圖是從onTabSelected創建在MainActivity這樣

@Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, show the tab contents in the 
     // container view. 
     Fragment fragment = new DummySectionFragment(); 

     Bundle args = new Bundle(); 
     args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, tab.getPosition() + 1); 
     fragment.setArguments(args); 
     getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); 
    } 
+0

也許是一個更好的問題是,究竟是什麼顯示的getSize給你?我知道的是getRealSize減去的東西,但究竟是什麼?它顯然不是操作欄加上導航欄。我認爲它只有其中一個 – steveh

回答

3

我想我有它

我想的getSize返回realsize減去導航欄,所以我需要減去操作欄

所以現在我這樣做:

@Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      if (container == null) { 
       return null; 
      } 

      Context context = getActivity(); 
      int tabNo = getArguments().getInt(ARG_SECTION_NUMBER); 
      Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

      // check display size to figure out what image resolution will be loaded 
      DisplayMetrics metrics = new DisplayMetrics(); 
      display.getMetrics(metrics); 
      Point size = new Point(); 
      display.getSize(size); 
      int width = size.x; 
      int height = size.y; 

      TypedValue tv = new TypedValue(); 
      int actionBarHeight=0; 
      if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) 
      { 
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); 
      } 

      height -= actionBarHeight; 

      //Log.d("MainActivity", "onCreateView tabNo="+tabNo +" display width="+width+" height="+height+" rotation="+rotation); 

      switch(tabNo){ 
      case 1: 
       return onCreateViewScoreFragment(context, width, height); 
      case 2: 
       return onCreateViewFilesFragment(context, inflater, width>height); 
      default: 
       return onCreateViewSettingsFragment(context, inflater, width>height); 
      } 
     } 

它適用於我的平板電腦,我不是100%地肯定其他設備,我將不得不等待,看看我的客戶說

+0

它幾乎爲我工作。我只需要用getResources()減去頂部狀態欄的高度。getDimensionPixelSize(getResources()。getIdentifier(「status_bar_height」,「dimen」,「android」)); – RobinDeCroon