Android 片段中的findViewById

Android 片段中的findViewById,android,android-fragments,android-imageview,findviewbyid,Android,Android Fragments,Android Imageview,Findviewbyid,我试图在片段中创建一个ImageView,该片段将引用我在XML中为片段创建的ImageView元素。但是,findViewById方法仅在扩展活动类时有效。还有什么我可以在片段中使用的吗 public class TestClass extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { I

我试图在片段中创建一个ImageView,该片段将引用我在XML中为片段创建的ImageView元素。但是,
findViewById
方法仅在扩展活动类时有效。还有什么我可以在片段中使用的吗

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
方法有一个错误,表明该方法未定义。

使用或执行
onViewCreated
方法中的View参数。它返回片段的根视图(由
onCreateView()
方法返回的根视图)
。有了它,您可以调用
findviewbyd()


由于
getView()
只能在
onCreateView()
之后工作,因此不能在片段的
onCreate()
onCreateView()
方法中使用它。

需要膨胀片段的视图,并在它返回的
视图上调用
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;
}

首先获取片段视图,然后从该视图获取您的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;
}

您可以覆盖onViewCreated(),该函数在所有视图膨胀后立即调用。这是填写片段的成员
视图
变量的正确位置。下面是一个例子:

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

我意识到这是一个老生常谈的问题,但普遍的答案令人不满意

问题不清楚
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;
    }
}

同意在视图上调用
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;
}

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

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

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}
就像这里一样:(在API级别28中不推荐)


是可能的。

Fragment
类中,您将获得override方法,在该方法中,您应该始终初始化视图,因为在此方法中,您可以获得视图对象,您可以使用该对象查找视图,如:

@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);
}
请始终记住,在出现片段时,如果从
onCreateView()
方法返回null或
super.onCreateView()
,则不会自动调用
onViewCreated()
方法。 默认情况下,如果
ListFragment
作为
ListFragment
返回
FrameLayout
,则会调用它

注意:成功执行
onCreateView()
后,可以使用
getView()
在类中的任何位置获取片段视图。 i、 e

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

您可以使用Activity对象调用
findViewById()
,进入片段中的
public void-onAttach(Activity-Activity)
方法

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

片段类中
私人活动main活动
onAttach()方法中:
this.mainActivity=activity

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

实现此功能的最佳方法如下:

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布局中定义的每个控件,这样代码就更干净了

希望这有帮助:)

getView()
将提供根视图

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

根据API 11级的文件

引用,在后堆栈中

短代码

/**
 * 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;
}
使用gradle,它将根据布局自动生成视图持有者类

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类。

使用

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

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

它将在onCreateView方法内部工作

1) 首先,必须对要添加的布局/视图进行充气 线性布局

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);
2) 然后可以从布局中找到imageView id

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);
3) 返回膨胀的布局

return ll;

还有一个方法叫做onViewCreated

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
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);
}
试试这个:

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

return 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
}}
试一试


试试这个它对我有用

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

在片段中,我们需要一个该窗口的视图,以便对该片段进行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;
        }
    }

布局充气机进入图片这里。Layout 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;
    }
}
注:

从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;
}
1) 首先膨胀碎片的布局,然后可以使用findviewbyId

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

Fragment
类中,我们得到了
onViewCreated()
重写方法,在该方法中我们应该始终初始化视图,因为在该方法中我们得到了
视图
对象。使用此对象,我们可以找到如下视图:

class MyFragment extends Fragment {
    private ImageView imageView;

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

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

我喜欢一切都有条理。你可以这样做

首先初始化视图

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

那么,onCreate方法在片段中有用吗?onCreateView创建并返回视图
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;
}
View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;
class MyFragment extends Fragment {
    private ImageView imageView;

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

    @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);
    }
}
private ImageView imageView;
@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        findViews(view);
    }
private void findViews(View v) {
    imageView = v.findViewById(R.id.img);
}