【问题标题】:Get size of fragment's parent view to size children programmatically以编程方式获取片段父视图的大小以调整子视图的大小
【发布时间】:2012-06-12 22:42:03
【问题描述】:

我有一个包含片段的布局。我将 Layout 的宽度设置为 300dip。

我想以编程方式计算子代相对于父代的 300dip 的宽度。

我不能在 XML 中做到这一点,因为它有一些“技巧”并且使用权重或相对布局将不起作用,我必须使用数学。

这是包含布局的片段...

<LinearLayout 
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <fragment
        android:id="@+id/tabbar"
        android:name="com.test.MyFragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

在 MyFragment 中有方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("test", "container: "  + container);
    View view = inflater.inflate(R.layout.mylayout, container, false);
    Log.d("test", "view width: "  + view.getWidth());

    //do things with view

    return view;
}

我得到了输出容器:null 和视图宽度:0,我在片段或类似中找不到任何 onMeasure 方法。

【问题讨论】:

    标签: android view fragment


    【解决方案1】:

    onCreateView 在你的布局膨胀之前被调用,所以它们没有heightwidth。如果你想摆弄布局和views的绘制方式,你可以创建自己的视图,扩展View,并实现onLayout();如果你用 Google 搜索,就会有很多这样的例子。

    【讨论】:

    • 我考虑过创建一个自定义视图,但如果它是一个片段,我不知道该怎么做......我正在关注这个关于使用片段创建选项卡视图的示例,选项卡栏也是实现为片段neilgoodman.net/2012/03/12/…,这就是我想要“自定义”的内容
    • 您可以创建一个视图,例如 CustomButton,它扩展了 Button 或 View 或 TextView,然后您可以实现 onLayout 以完全按照您的需要布局您的按钮。但同样,我认为标准的 android 布局功能应该能够以更简单的方式为您提供正确的布局。
    • 是的,我知道,但问题是如何使用 fragment。因为我使用的代码使用了一个片段,我想自定义它。我不知道这是否通常是错误的,我必须使用视图来代替?是否存在“自定义片段”之类的东西,还是我完全错了?
    • 片段使用布局文件。如果要自定义 Fragment 视图,可以自定义 Fragment 膨胀的布局。如果我正确理解你的问题....
    • 是的,但我还需要对片段视图进行编程自定义,因此更改 XML 是不够的。
    【解决方案2】:

    我认为您可以在 onActivityCreated 方法中以编程方式找到父视图 (LinearLayout) 的尺寸:

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){
         super.onActivityCreated(savedInstanceState);
    
         myActivityView =  (LinearLayout)  
                 getActivity().findViewById(((View) getView().getParent()).getId());
    
         myFragment = (RelativeLayout) getView().findViewById(R.layout.mylayout);
    //Change RelativeLayout to whatever your fragment is using
    }
    

    那么 myActivityView 应该是你的父视图。

    编辑

    然后您可以在 onActivityCreated 中使用ViewTreeObserver 来获取父视图的尺寸。 myFragment 应该是您的片段,因此您可以相对于从 myActivityView 返回的尺寸放置它。祝你好运。

    【讨论】:

    • 在 onActivityCreated 期间视图仍未布局。我刚刚尝试过,此时我所有视图的宽度和高度仍然为 0。
    • 您是否像 OP 一样在 xml 文件中设置父视图宽度?我很确定我在某些时候使用过它并且它有效。如果您发布一些 xml 和一些 java 文件,可能会更容易签出。
    • 是的,父级设置为match_parent/match_parent。
    • 啊,是的,很抱歉,我从 ViewTreeObserver 获取父级的尺寸:developer.android.com/reference/android/view/…。以下是如何使用它的示例:stackoverflow.com/questions/7733813/…。我想我更关心如何在这个问题中访问父布局,而不是返回实际尺寸的方法。感谢您指出了这一点。您可以在 onActivityCreated 方法中使用此 VTO。
    • +1 用于触发我脑海中的某些事情。获取视图的尺寸很棘手。
    【解决方案3】:

    使用 Handler 会得到高度和宽度。但这不是正确的方法。

    new Handler().postDelayed(new Runnable() {
          @Override
          public void run() {
             Log.d("test", "view width: "  + view.getWidth());
          }
        },1000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多