片段中的findViewById

时间:2011-06-27 16:24:48

标签: android android-fragments android-imageview 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);
    }
}

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

36 个答案:

答案 0 :(得分:1337)

使用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); 

由于getView()仅在onCreateView()之后有效,否则无法在片段的onCreate()onCreateView()方法中使用它。

答案 1 :(得分:591)

您需要对片段的视图进行充气,并在其返回的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;
}

答案 2 :(得分:123)

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);
}

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

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

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

答案 3 :(得分:65)

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

问题不明确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 :(得分:44)

首先获取片段视图,然后从此视图中获取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 :(得分:23)

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

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

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

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

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

是可能的。

答案 6 :(得分:18)

getView()将提供根视图

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

答案 7 :(得分: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);
    }
}

答案 8 :(得分:14)

方法 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 :(得分:10)

1)首先填充Fragment的布局然后你可以使用findviewbyId。

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

答案 10 :(得分:10)

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

答案 11 :(得分: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;
}

答案 12 :(得分: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;
}

答案 13 :(得分:8)

注意:

从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;
}

答案 14 :(得分:8)

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 :(得分:8)

使用

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

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

它会起作用

答案 16 :(得分:8)

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

答案 17 :(得分: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);
    }
}

答案 18 :(得分:5)

还有一个名为onViewCreated的方法。

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

答案 19 :(得分: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
}

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

希望这会有所帮助:)

答案 20 :(得分:4)

使用gradle skeleton plugin,它会自动生成视图持有者类,并引用您的布局。

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;
    }
}

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

答案 21 :(得分:4)

试试这个:

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

return v;

答案 22 :(得分:4)

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 :(得分:3)

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);
    }
}

答案 24 :(得分:3)

您可以使用活动对象调用findViewById(),然后进入片段内的public void onAttach(Activity activity)方法。

将活动保存到变量中,例如:

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

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

答案 25 :(得分:2)

在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;

答案 26 :(得分:2)

布局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 :(得分:2)

在片段中,我们需要该窗口的视图,以便我们创建此片段的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;
        }
    }

答案 28 :(得分:2)

你必须给视图充气

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
}}

答案 29 :(得分:1)

使用这种东西的最简单方法是使用奶油刀 通过这个,您可以通过@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;
    }
}

答案 30 :(得分:1)

getView()仅在 onCreateView()完成后起作用,因此请从onPostCreate()调用它:

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}

答案 31 :(得分:1)

//here you can do it by
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
  {
    // Inflate the layout for this fragment
    final View view =  inflater.inflate(R.layout.fragment_apple, container, 
 false);
    ist = view.findViewById(R.id.linearLink);
    second = view.findViewById(R.id.linearPhone);
    return view;

答案 32 :(得分:0)

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,因为它会返回rootview,并且会在onCreateView()方法之后显示一些视图。

答案 33 :(得分:0)

非常简单的方法:

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

答案 34 :(得分:0)

我喜欢一切都井井有条。您可以通过这种方式进行。

第一个初始化视图

private ImageView imageView;

然后覆盖OnViewCreated

@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        findViews(view);
    }

然后添加一个void方法来查找视图

private void findViews(View v) {
    imageView = v.findViewById(R.id.img);
}

答案 35 :(得分:-3)

.commit()之后的交易时间也可能导致此问题

我遇到了同样的问题(无法访问片段中的视图)。原因是 - 在(FragmentTransaction) .commit()之后 - ,在UI中尚未激活View。 无法保证何时,在.commit()之后,交易发生;它只排队。所以我添加了一个(FragmentManager) .executePendingTransactions()来强制完成交易。之后,引用View按预期工作!