【问题标题】:View going out of screen in dynamic image views inside horizontal linear layout在水平线性布局内的动态图像视图中查看屏幕外
【发布时间】:2017-12-25 07:09:47
【问题描述】:

我在我的 LinearLayout 中以编程方式膨胀 ImageView 和 TextView 的组合。我的线性布局位于水平滚动视图下。但是当我将 layout_gravity="center_horizo​​ntal" 设置为线性布局的父级时,线性布局内的内容会超出屏幕。

看看发生了什么:

我正在使用 layout_gravity 来实现这一点

没有 layout_gravity 它看起来像这样

但是,如果我使用 layout_gravity 并且该 Horizo​​ntalScrollView 中有很多项目,则不会显示 1 或 2 个项目。您可以查看第一个上传的图像以了解该场景。在第一张图片中,我无法向右滚动更多,我只能看到 ImageView 和 TextView 组合,而且,还有一个这样的组合完全不在屏幕之外。

这是xml结构

<HorizontalScrollView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"

                    android:scrollbarAlwaysDrawHorizontalTrack="false"
                    android:scrollbars="none"
                    android:id="@+id/hotel_detail_services">
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:orientation="horizontal">
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="vertical"
                            android:id="@+id/imageViewLayout"
                            >
                        </LinearLayout>

                    </LinearLayout>
                </HorizontalScrollView>

Java 操作

    @Override
    protected void onPostExecute(List<hotel_detail_model> hotel_detail_models) {
        super.onPostExecute(hotel_detail_models);
        LinearLayout layout = findViewById(R.id.imageViewLayout);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.setGravity(Gravity.CENTER_HORIZONTAL);


        if (hotel_detail_models.get(0).getTv()==1)
            addHotelSpeciality(layout,"TV",R.drawable.tv);
        if (hotel_detail_models.get(0).getAc()==1)
            addHotelSpeciality(layout,"AC",R.drawable.ac);
        if (hotel_detail_models.get(0).getGeyser()==1)
            addHotelSpeciality(layout,"Geyser",R.drawable.geyser);
        if (hotel_detail_models.get(0).getBus()==1)
            addHotelSpeciality(layout,"BUS",R.drawable.bus);
        if (hotel_detail_models.get(0).getCab()==1)
            addHotelSpeciality(layout,"CAB",R.drawable.cab);
        if (hotel_detail_models.get(0).getFood()==1)
            addHotelSpeciality(layout,"FOOD",R.drawable.food);
        if (hotel_detail_models.get(0).getRailway()==1)
            addHotelSpeciality(layout,"Train",R.drawable.train);
        if (hotel_detail_models.get(0).getAirport()==1)
            addHotelSpeciality(layout,"Airport",R.drawable.airport);
        if (hotel_detail_models.get(0).getMedical()==1)
            addHotelSpeciality(layout,"Medical",R.drawable.medical);
        progressDialog.dismiss();
    }
    //Add Image Dynamically
    private void addHotelSpeciality(LinearLayout layout, String image_name, int image_id) {
        LinearLayout linearLayout = new LinearLayout(hotel_details.this);
        ImageView image = new ImageView(hotel_details.this,null,R.style.dynamicImageHotel);
        TextView textView = new TextView(hotel_details.this,null,R.style.dynamicTextHotel);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen._25sdp),
                getResources().getDimensionPixelSize(R.dimen._25sdp));
        params.weight = 1.0f;
        params.gravity = Gravity.CENTER_HORIZONTAL;


        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        params2.weight = 1.0f;
        params2.gravity = Gravity.CENTER_HORIZONTAL;

        LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        params3.weight = 1.0f;
        params2.gravity = Gravity.CENTER_HORIZONTAL;


        image.setLayoutParams(params);
        image.setScaleType(ImageView.ScaleType.FIT_CENTER);
        textView.setLayoutParams(params2);
        image.setImageDrawable( getResources().getDrawable(image_id));
        textView.setText(image_name);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            textView.setTextAppearance(R.style.dynamicTextHotel);

        }else {
            textView.setTextAppearance(hotel_details.this,R.style.dynamicTextHotel);
        }
        // Adds the view to the layout
        linearLayout.addView(image);
        linearLayout.addView(textView);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setLayoutParams(params3);           linearLayout.setPadding(getResources().getDimensionPixelSize(R.dimen._15sdp),0,0,0);
        layout.addView(linearLayout);
    }

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    这不正是您想要通过使用HorizontalScrollView 来实现的吗? ScrollViews 允许内容大于物理显示,因此当您添加足够的“hotelSpecialities”时,它会离开屏幕,您可以滚动浏览它。如果您试图将所有内容都放在屏幕上,那么您不会使用HorizontalScrollView


    好的,现在我知道您要实现的目标,将您的 ScrollView 放入 RelativeLayout 即可。

    这对我来说很有效

    <RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_height="wrap_content"
      android:layout_width="match_parent">
      <HorizontalScrollView
        android:id="@+id/hotel_detail_services"
        android:layout_centerHorizontal="true"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:scrollbarAlwaysDrawHorizontalTrack="false"
        android:scrollbars="none">
        <LinearLayout
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:orientation="horizontal">
          <LinearLayout
            android:id="@+id/imageViewLayout"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:orientation="vertical">
          </LinearLayout>
    
        </LinearLayout>
      </HorizontalScrollView>
    </RelativeLayout>
    

    如果不需要,您也可以删除 imageViewLayout 的父 LinearLayout。如果您需要更多帮助,请告诉我!

    【讨论】:

    • 但第一个内容即使在滚动后也不会出现在屏幕上。这就是我的意思。如果您看到屏幕截图,则 Horizo​​ntalScrollView 处于无法向左滚动的位置,但我看不到任何项目。
    • 抱歉,截图没有说明。我已经更新了我的答案来解决这个问题
    • 不适用于上述更改
    • 对不起,我弄错了。你想通过使用layout_gravity="center_horizontal" 来实现什么?这会将布局相对于其父级水平居中,在本例中为 HorizontalScrollView
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多