android-fragments 为什么我不能从相关的fragment类中将背景图像设置到一个声明为fragment xml配置的ImageView中?

thigvfpy  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(128)

我绝对是Android开发新手,我在开发我的第一个应用程序时遇到了一些问题。
于是就有了如下的情况:
1.我有一个fragment_screen_slide_page.xml文件,其中包含显示在视图中的片段元素,并且在将其加载到Activity中时必须显示图像:

<!-- Dummy content. -->
 <LinearLayout android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:padding="0dp">

     <ImageView
         android:id="@+id/imageView1"
         android:layout_width="wrap_content"
         android:scaleType="fitCenter"
         android:layout_height="250dp"
         android:background="@drawable/carbonara" />

     <TextView android:id="@android:id/text1"
         style="?android:textAppearanceLarge"
         android:textStyle="bold"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginBottom="16dp" />

 </LinearLayout>

如您所见,它包含ImageView元素,id=imageView1(当片段放入Activity时,必须加载图像)。
然后,我有这个ScreenSlidePageFragment,它在前面的片段上工作,我有这样的东西:

public class ScreenSlidePageFragment extends Fragment {

    ................................................................
    ................................................................
    ................................................................

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

       System.out.println("PAGE NUMBER: "+ mPageNumber + 1);
        // Inflate the layout containing a title and body text.
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false);

        // Set the title view to show the page number.
        ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1));
        System.out.println("TESTO: "+ getString(R.string.title_template_step, mPageNumber + 1));

        // Obtain the colosseum_icon.png from the rsources as a Drawable:
        Drawable drawable = getResources().getDrawable(R.drawable.colosseum_icon);

        // Retrieve the reference of the ImageView element of the layout having id=imgSlide:
        View view = inflater.inflate(R.layout.fragment_screen_slide_page,container,false);
        ImageView imgSlideView = (ImageView) view.findViewById(R.id.imageView1);

        final int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
            imgSlideView.setBackgroundDrawable(drawable);
        } else {
                                  //imgSlideView.setBackground(getResources().getDrawable(R.drawable.colosseum_icon));
        }

        return rootView;
    }
        ................................................................
        ................................................................
        ................................................................
    }

    ................................................................
    ................................................................
    ................................................................
}

所以可以看到,进入onCreateView()方法我基本上做了如下操作:
1.我检索在先前的
fragment_screen_slide_page.xml
文件中声明了id=imageView1ImageView元素引用。
1.我将检索到的可绘制对象设置为此ImageView的背景,执行以下操作:

imgSlideView.setBackgroundDrawable(drawable)

我希望此图像必须显示在屏幕上,但没有显示。未显示与检索到的drawable变量相关的图像。显示的不是图像,而是高度为250dp的空白空间(如XML中指定的)。在空白图像下显示TextView的预期内容
我遗漏了什么?如何解决此问题?

4smxwvx5

4smxwvx51#

首先,您希望在ImageView上使用android:src="@drawable/carbonara"而不是android:background="@drawable/carbonara",并且您设置了.setImageDrawable而不是.setBackgroundDrawable
下一步-View view = inflater.inflate(R.layout.fragment_screen_slide_page,container,false);是不需要的,应该删除。它应该是ImageView imgSlideView = (ImageView) rootView.findViewById(R.id.imageView1);,而不是ImageView imgSlideView = (ImageView) view.findViewById(R.id.imageView1);
当然这也

final int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        imgSlideView.setBackgroundDrawable(drawable);
}

只有在sdk低于Jelly Bean时才被激活(我不确定这是否适用于您的测试环境)。

iqjalb3h

iqjalb3h2#

使用setImageResource()而不是setBackgroundDrawable()

应该是这样的
(R.可绘制的图形。您的图像);

gg0vcinb

gg0vcinb3#

函数inflate每次都会生成一个新的视图。您调用了两次,因此您有两个单独的视图:view和rootView,并返回rootView,因此片段将显示rootView,无视图。无图像。更改如下:

// Retrieve the reference of the ImageView element of the layout having id=imgSlide:
ImageView imgSlideView = (ImageView) rootView.findViewById(R.id.imageView1)

年,以及更多,ImageView应该使用android:src和setImageDrawable
一切都会好起来的。
添加,此代码块存在问题:

final int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
       // if your phone version below 4.1
    imgSlideView.setBackgroundDrawable(drawable);
} else {
                          //imgSlideView.setBackground(getResources().getDrawable(R.drawable.colosseum_icon));
}

如果你的手机,安卓版本大于4.1(我想是的-_-|),您不会更改图像。因此取消注解else代码。

相关问题