在片段中使用 Imageview

Using Imageview in Fragment

我正在尝试在片段中设置图像视图:

ImageView imageView = (ImageView) getActivity().findViewById(R.id.qrCode);

    try {
        Bitmap bitmap = encodeAsBitmap(STR);
        imageView.setImageBitmap(bitmap);
    } catch (WriterException e) {
        e.printStackTrace();
    }

但是我收到错误

"Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference".

如果我将它放在扩展 AppCompatActivity 但不在我的片段 class 中的 class 中,则此方法有效。

对应的xml文件为:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">


<!--   tools:context="${relativePackage}.${activityClass}" > -->

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:gravity="center"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/welcome"
            android:textSize="20dp" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textColor="@color/lbl_name"
            android:textSize="24dp" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="13dp" />

        <Button
            android:id="@+id/btnLogout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dip"
            android:background="@color/btn_logut_bg"
            android:text="@string/btn_logout"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />

        <ImageView
            android:id="@+id/qrCode"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />

    </LinearLayout>



</RelativeLayout>

而不是 getActivity() 使用 getView()

像这样

ImageView imageView = (ImageView) getView().findViewById(R.id.qrCode);

在你的片段中

getActivity() returns activity 您的片段所附加的对象,而 getView() 将 return 您片段的根视图,其中所有其他存在视图,然后您可以通过它们的 ID 找到它们。

在您的 activity class 中将其设为 public 静态并在您的片段中使用它,如下所示:

在你的 activity;

 public static ImageView imageView;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.YOURLAYOUT);


 imageView = (ImageView) getActivity().findViewById(R.id.qrCode);

}

在你的片段中,

try {
    Bitmap bitmap = encodeAsBitmap(STR);
    YOURACITVITYNAME.imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
    e.printStackTrace();
}

应该是这样的

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.your_layout, container,
            false);

    ImageView imageView = (ImageView) rootView.findViewById(R.id.qrCode);

    return rootView;
}

我认为你做错了

ImageView imageView = (ImageView) getActivity().findViewById(R.id.qrCode);

这不是你在 fragment class.In fragment 中的做法,有一个 View(inflator.inflate) 可以通过该视图扩展布局 n 你可以访问所有的 id。所以你应该尝试这样的事情:

ImagView imageView = (ImageView) view.findViewById(R.id.qrCode);

在 class 变量中存储片段视图。

private View myFragmentView;

在oncreateView中

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        myFragmentView = inflater.inflate(R.layout.signup_addressinfo_layout, container, false);

    return myFragmentView;
}

在你的函数中

 ImageView imageView = (ImageView) myFragmentView.findViewById(R.id.qrCode);

你做的方式是错误的,你总是得到空对象引用错误,因为在片段的情况下,视图绑定发生在 onCreateView()

你需要这样做:

public class MyFragment extends Fragment {

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

         // here replace fragment_layout with your xml layout that you have created
         View v = inflater.inflate(R.layout.fragment_layout, container, false);
         ImageView ivQrCode =(ImageView) v.findViewById(R.id.qrCode);

         try {
            Bitmap bitmap = encodeAsBitmap(STR);
            ivQrCode.setImageBitmap(bitmap);
         } catch (WriterException e) {
            e.printStackTrace();
         }

         return v;
    }
}