片段中的findViewById

sim*_*ed. 975 android android-imageview android-fragments findviewbyid

我试图在片段中创建一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

adv*_*tej 1379

使用getView()或View参数来实现该 onViewCreated方法.它返回片段的根视图(onCreateView()方法返回的视图).有了它,你可以打电话findViewById().

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

由于getView()只有在工作onCreateView(),你不能用它里面onCreate()onCreateView()方法的片段.

  • 注意:它仅在onCreateView()之后有效.所以,你不能在onCreate()中使用它 (315认同)
  • 该文档声明`onActivityCreated()`是查找和存储对视图的引用的推荐位置.你必须**通过在`onDestroyView()`中将它们设置回`null`来清理这些存储的引用,否则你将泄漏`Activity`. (36认同)
  • onViewCreated方法的最佳位置 (24认同)
  • 如果`ImageView`来自膨胀的布局,这无济于事 - 详情请参阅我的答案.否则,onCreateView是正确的地方@ N-AccessDev (16认同)
  • 那么如果onCreate不是正确的地方,我可以覆盖实现这个功能的是什么? (6认同)
  • @Locutus`你必须通过在onDestroyView()中将它们设置为null来清理这些存储的引用,否则你会泄漏Activity`引用吗? (2认同)

Lef*_*nia 603

您需要膨胀片段的观点,并呼吁findViewById()View它的回报.

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 然后,"拥有"并夸大imageView的类需要提供对它的公共访问.但这是非常糟糕的做法.片段应该只能访问其布局中存在的UI元素. (18认同)
  • 当你执行V.findViewById(R.id.someid)时,肯定只适用于膨胀视图中的所有小部件.如果他试图膨胀的imageView在膨胀的视图之外怎么办? (4认同)
  • 这应该是正确的答案.接受的一个离开你的'NullPointerException`. (3认同)

Ank*_*ary 126

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

永远记住,在Fragment的情况下,onViewCreated()如果返回null或super.onCreateView()onCreateView()方法返回,则不会自动调用该方法.默认情况下将在案件被称为ListFragmentListFragment返回FrameLayout默认.

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

getView().findViewById("your view id");
Run Code Online (Sandbox Code Playgroud)

  • 令我惊讶的是,很多人都没有对这个响应进行投票 - 这是在片段上设置监听器的正确方法......也许这是API中的一个新开发. (4认同)

Mat*_*nko 66

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

问题不明确是什么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;
    }
}
Run Code Online (Sandbox Code Playgroud)


xev*_*ent 45

首先获取片段视图,然后从此视图中获取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;
}
Run Code Online (Sandbox Code Playgroud)


小智 25

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

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

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

getView().findViewById(R.id.foo);
Run Code Online (Sandbox Code Playgroud)

getActivity().findViewById(R.id.foo);
Run Code Online (Sandbox Code Playgroud)

是可能的.


dre*_*per 18

getView() 将给出根视图

View v = getView().findViewByID(R.id.x); 
Run Code Online (Sandbox Code Playgroud)


Lez*_*Lez 17

您可以覆盖在所有视图被夸大后立即调用的onViewCreated().这是填写Fragment成员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);
    }
}
Run Code Online (Sandbox Code Playgroud)


sag*_*its 15

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);
}
Run Code Online (Sandbox Code Playgroud)


pri*_*iti 11

1)首先膨胀Fragment的布局,然后你可以使用findviewbyId.

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


san*_*dhu 10

EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
Run Code Online (Sandbox Code Playgroud)


小智 9

同意呼吁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;
}
Run Code Online (Sandbox Code Playgroud)


Man*_*war 9

使用

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

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
Run Code Online (Sandbox Code Playgroud)

它会工作


Nov*_*cas 9

注意 :

从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;
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*dri 8

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

  • 视图不是活动 (3认同)

小智 8

根据API级别11的文档

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

短代码

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)


Vip*_*ati 8

Fragment类内部,您将获得onViewCreated()重写方法,在该方法中应始终初始化视图,因为在此方法中,您将获得view对象,通过该对象可以找到视图,例如:

class MyFragment extends Fragment {
    private ImageView imageView;

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
Run Code Online (Sandbox Code Playgroud)


Bip*_*rti 7

试试这个对我有用

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Reh*_*han 7

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


Mic*_*rla 5

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助 :)


Nan*_*pal 5

1)声明您的布局文件.

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

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

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


Abh*_*hra 5

尝试这个:

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

return v;
Run Code Online (Sandbox Code Playgroud)


Ram*_*r.M 5

尝试

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;
}
Run Code Online (Sandbox Code Playgroud)