Android 如何在片段中设置ContentView?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12108370/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:45:23  来源:igfitidea点击:

How to setContentView in a fragment?

androidandroid-fragmentsandroid-view

提问by lamp ard

Now I've got this fragment which i want to use setContentView with but so far i cant find how. You can see my case in the code below, im not trying to inflate a layout, im trying to use it with the view called SampleView. So how can I do that? Thanks in advance

现在我有了这个片段,我想将它与 setContentView 一起使用,但到目前为止我无法找到方法。你可以在下面的代码中看到我的情况,我不是试图膨胀布局,我试图将它与名为 SampleView 的视图一起使用。那我该怎么做呢?提前致谢

public class largeImageScroller extends SherlockFragment {

// Physical display width and height.
private static int displayWidth = 0;
private static int displayHeight = 0;

/** Called when the activity is first created. */
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {

        getActivity();
        // displayWidth and displayHeight will change depending on screen
        // orientation. To get these dynamically, we should hook onSizeChanged().
        // This simple example uses only landscape mode, so it's ok to get them
        // once on startup and use those values throughout.

        Display display = ((WindowManager)
getActivity().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        displayWidth = display.getWidth();             
        displayHeight = display.getHeight();    

        // SampleView constructor must be constructed last as it needs the
        // displayWidth and displayHeight we just got.
        setContentView(new SampleView(this));
}

private static class SampleView extends View {
        private static Bitmap bmLargeImage; //bitmap large enough to be scrolled
        private static Rect displayRect = null; //rect we display to
        private Rect scrollRect = null; //rect we scroll over our bitmap with
        private int scrollRectX = 0; //current left location of scroll rect
        private int scrollRectY = 0; //current top location of scroll rect
        private float scrollByX = 0; //x amount to scroll by
        private float scrollByY = 0; //y amount to scroll by
        private float startX = 0; //track x from one ACTION_MOVE to the next
        private float startY = 0; //track y from one ACTION_MOVE to the next

        public SampleView(Context context) {
                super(context);

                // Destination rect for our main canvas draw. It never changes.
                displayRect = new Rect(0, 0, displayWidth, displayHeight);
                // Scroll rect: this will be used to 'scroll around' over the
                // bitmap in memory. Initialize as above.
                scrollRect = new Rect(0, 0, displayWidth, displayHeight);

                // Load a large bitmap into an offscreen area of memory.
                bmLargeImage = BitmapFactory.decodeResource(getResources(),
                        R.drawable.ground_floor_b);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {

                switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                // Remember our initial down event location.
                                startX = event.getRawX();
                                startY = event.getRawY();
                                break;

                        case MotionEvent.ACTION_MOVE:
                                float x = event.getRawX();
                                float y = event.getRawY();
                                // Calculate move update. This will happen many times
                                // during the course of a single movement gesture.
                                scrollByX = x - startX; //move update x increment
                                scrollByY = y - startY; //move update y increment
                                startX = x; //reset initial values to latest
                                startY = y;
                                invalidate(); //force a redraw
                                break;
                }
                return true; //done with this event so consume it
        }

        @Override
        protected void onDraw(Canvas canvas) {

                // Our move updates are calculated in ACTION_MOVE in the opposite direction
                // from how we want to move the scroll rect. Think of this as dragging to
                // the left being the same as sliding the scroll rect to the right.
                int newScrollRectX = scrollRectX - (int)scrollByX;
                int newScrollRectY = scrollRectY - (int)scrollByY;

                // Don't scroll off the left or right edges of the bitmap.
                if (newScrollRectX < 0)
                        newScrollRectX = 0;
                else if (newScrollRectX > (bmLargeImage.getWidth() - displayWidth))
                        newScrollRectX = (bmLargeImage.getWidth() - displayWidth);

                // Don't scroll off the top or bottom edges of the bitmap.
                if (newScrollRectY < 0)
                        newScrollRectY = 0;
                else if (newScrollRectY > (bmLargeImage.getHeight() - displayHeight))
                        newScrollRectY = (bmLargeImage.getHeight() - displayHeight);

                // We have our updated scroll rect coordinates, set them and draw.
                scrollRect.set(newScrollRectX, newScrollRectY,
                        newScrollRectX + displayWidth, newScrollRectY + displayHeight);
                Paint paint = new Paint();
                canvas.drawBitmap(bmLargeImage, scrollRect, displayRect, paint);

                // Reset current scroll coordinates to reflect the latest updates,
                // so we can repeat this update process.
                scrollRectX = newScrollRectX;
                scrollRectY = newScrollRectY;
        }
}
}

回答by waqaslam

You dont call setContentViewin fragments, in fact you need to return a Viewfrom onCreateView.

您不调用setContentView片段,实际上您需要ViewonCreateView.

Try replacing:

尝试更换:

setContentView(new SampleView(this));

With this:

有了这个:

return new SampleView(this);

回答by bjorncs

Return the view instance you want to use:

返回您要使用的视图实例:

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

回答by biegleux

Also it's not safe to call getActivity()from onCreateView(). Make sure you call it in or after onActivityCreated(), as at this point your Fragmentis fully associated with the Activity. Check Fragment's lifecycle.

此外,getActivity()onCreateView(). 确保您在 中或之后调用它onActivityCreated(),因为此时您Fragment已与Activity. CheckFragment的生命周期。

Fragments

碎片

回答by Manish Patel

As explained already, you need to return the view in case of fragments. But still if you want to use it just like setContentView(), you can do so in following way.

如前所述,您需要在片段的情况下返回视图。但是如果你想像 一样使用它setContentView(),你可以通过以下方式进行。

1.Put this code snippet wherever you had to put setContentView()

1.把这个代码片段放在你必须放的地方 setContentView()

View v = inflater.inflate(R.layout.activity_home, container, false);

2.Now if you want to access something from xml file, you can do so by using

2.现在如果你想从xml文件中访问一些东西,你可以使用

chart = v.findViewById(R.id.chart);

3. And in the end of OnCreateView()you will have to put

3.最后OnCreateView()你必须把

return v;

Full example :

完整示例:

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


    View v = inflater.inflate(R.layout.activity_home, container, false);

    chart = v.findViewById(R.id.chart);

    return v;
   }

回答by Sankar

In activities we need to set the view using setContentView(R.layout.main)

在活动中,我们需要使用设置视图 setContentView(R.layout.main)

Where as in fragments we need to override onCreateView()to set the desired view.

在片段中,我们需要覆盖onCreateView()以设置所需的视图。