提问



我试图在片段中创建一个ImageView,它将引用我在片段的XML中创建的ImageView元素。但是,findViewById方法仅在扩展Activity类时才有效。无论如何,我还可以在片段中使用它吗?


public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}


findViewById方法有一个错误,表明该方法是未定义的。

最佳参考


使用getView()或View参数来实现onViewCreated方法。它返回片段(由onCreateView()方法返回的)的根视图。有了这个你可以打电话findViewById()[75]


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 


由于getView()仅在onCreateView()之后起作用,所以不能在片段的onCreate()onCreateView()方法中使用它。

其它参考1


你需要给Fragment的视图充气并在它返回的View上调用findViewById()


public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}

其它参考2


Fragment类中,您将获得onViewCreated()覆盖方法,您应该始终初始化视图,因为在此方法中您可以使用视图对象来查找您的视图,如:[76]


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);

    // or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}


永远记住,在Fragment的情况下,如果从onCreateView()方法返回null或super.onCreateView(),则onViewCreated()方法不会自动调用。
默认情况下,如果ListFragmentListFragment返回FrameLayout,则默认调用它。


注意:一旦onCreateView()成功执行,您可以使用getView()在类中的任何位置获取片段视图。
 即


getView().findViewById("your view id");

其它参考3


我意识到这是一个古老的问题,但是流行的答案还有待改进。


问题不明确imageView需要什么 - 我们是将它作为视图传回,还是仅仅为以后保存参考?


无论哪种方式,如果ImageView来自膨胀的布局,正确的方法是:


public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
        return v;
    }
}

其它参考4


首先获取片段视图,然后从此视图中获取ImageView。


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
    return view;
}

其它参考5


您也可以在onActivityCreated方法中执行此操作。


public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}


就像他们在这里一样:http://developer.android.com/reference/android/app/Fragment.html (在API级别28中弃用) [77]


getView().findViewById(R.id.foo);





getActivity().findViewById(R.id.foo);


是可能的。

其它参考6


getView()将给出根视图


View v = getView().findViewByID(R.id.x); 

其它参考7


您可以覆盖在所有视图被夸大后立即调用的onViewCreated()。这是填写片段成员View变量的正确位置。这是一个例子:


class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}

其它参考8


方法 getView()不适用于OnCreate和类似方法之外的片段。


您有两种方法,将视图传递给oncreate上的函数(这意味着您只能在创建视图时运行函数)或将视图设置为变量:


private View rootView;

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

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}

其它参考9


EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  

其它参考10


根据API级别11的文档


参考,在Back Stack中
http://developer.android.com/reference/android/app/Fragment.html[78]


短代码


/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}

其它参考11


同意在视图上调用findViewById()


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View V = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) V.findViewById(R.id.my_image);

    return V;
}

其它参考12


使用getView()返回片段的视图,然后可以调用findViewById()访问片段视图中的任何视图元素。

其它参考13


使用


imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);


它会工作

其它参考14


1)声明您的布局文件。


public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}


2)然后,获取您的视图的ID


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}

其它参考15


试试这个对我有用


public class TestClass extends Fragment {
    private ImageView imageView;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.testclassfragment, container, false);
        findViews(view);
        return view;
    }

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}

其它参考16


注意 :


从API级别26开始,您也不需要专门投射findViewById的结果,因为它使用了对其返回类型的推断。


所以现在你可以做到,


public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}

其它参考17


1)首先膨胀片段的布局,然后你可以使用findviewbyId。


View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;

其它参考18


实现此目的的最佳方法如下:


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

rootView = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView) rootView.findViewById(R.id.my_image);
        return rootView
}


通过这种方式,rootView可用于xml布局中定义的每个控件,并且代码更加清晰。


希望这可以帮助 :)

其它参考19


还有一个名为onViewCreated的方法。


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}

其它参考20


使用gradle skeleton插件,它将自动生成视图持有者类,并引用您的布局。[79]


public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyLayout myLayout = new MyLayout(inflater, container, false);
        myLayout.myImage.setImageResource(R.drawable.myImage);
        return myLayout.view;
    }
}


现在假设您在my_layout.xml文件中声明了ImageView,它将自动为您生成myLayout类。

其它参考21


尝试这个:


View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;

其它参考22


尝试


private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}

其它参考23


您可以使用Activity对象调用findViewById()进入Fragment中的public void onAttach(Activity activity)方法。


将Activity保存到变量中,例如:


Fragment类中:
private Activity mainActivity;
onAttach()方法中:
this.mainActivity=activity;


最后通过vairable执行每个findViewById:
mainActivity.findViewById(R.id.TextView);

其它参考24


在onCreateView方法里面


1)首先你必须膨胀你想要添加的布局/视图
例如。的LinearLayout


LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);


2)然后你可以从布局中找到你的imageView id


ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);


3)返回膨胀的布局


return ll;

其它参考25


你必须给视图充气


public class TestClass extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v
}}

其它参考26


布局inflater在这里进入图片。布局inflater是一个使我们能够在java代码中使用XML视图的类。因此,您可以使用以下代码在变量v中扩充根xml视图。然后使用v,您可以找到根视图v的子视图。


public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v;
    }
}

其它参考27


使用这种东西的最简单方法是使用奶油刀
通过这个,您可以通过@OnClick()添加尽可能多的Onclciklistener,如下所述:


public class TestClass extends Fragment {
    @BindView(R.id.my_image) ImageView imageView;
    @OnClick(R.id.my_image)
    public void my_image_click(){
        yourMethod();
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.testclassfragment, container, false);
        ButterKnife.bind(getActivity,view);
        return view;
    }
}

其它参考28


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}


请注意,如果使用getView()方法,它可能会导致nullPointerException,因为它返回根视图,它将是onCreateView()方法之后的某个视图。

其它参考29


在片段中,我们需要该窗口的视图,以便我们创建此片段的onCreateView。


然后获取视图并使用它来访问该视图元素的每个视图ID。


  class Demo extends Fragment
    {
        @Override
        public View onCreateView(final LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
            View view =inflater.inflate(R.layout.demo_fragment, container,false);
            ImageView imageview=(ImageView)view.findViewById(R.id.imageview1);

            return view;
        }
    }