首页 \ 问答 \ 龙目岛懒惰的可变集合的吸气剂(Lombok lazy getter for mutable collections)

龙目岛懒惰的可变集合的吸气剂(Lombok lazy getter for mutable collections)

我有一个有集合的类:

public class Foo
{
    @Inject
    private BarManager barManager;
    @Getter(lazy = true)
    private final List<Bar> bars = barManager.getAll();

    public void addBar(Bar bar)
    {
        bars.add(bar);
    }
}

但是我不能在List添加/删除元素。 原因是该属性是AtomicReference 。 警告/错误是:

The method add(Employee) is undefined for the type  AtomicReference<AtomicReference<List<Employee>>>

如何在集合上执行添加/删除操作?


I have a class which has a collection:

public class Foo
{
    @Inject
    private BarManager barManager;
    @Getter(lazy = true)
    private final List<Bar> bars = barManager.getAll();

    public void addBar(Bar bar)
    {
        bars.add(bar);
    }
}

However I cannot add/remove elements to/from the List. The cause is that the attribute is an AtomicReference. The warning/error is:

The method add(Employee) is undefined for the type  AtomicReference<AtomicReference<List<Employee>>>

How can perform add/remove operations on the collection?


原文:https://stackoverflow.com/questions/12160250
更新时间:2023-01-19 18:01

最满意答案

我通过向ShowCaseView添加子视图解决了这个问题。

UPD

我被要求分享解决方案,所以我将与我使用的所有代码共享。

这是我使用ShowCaseView完整代码:我使用Fragment来显示它,因此我不需要每次都复制代码,我也做了一些改进,使生活更轻松:

frShowCase.java:

/**
 * Created by Movsar Bekaev on 02/09/2015.
 */
public class frShowCase extends Fragment {
    static boolean is_sc_done;
    static ArrayList<xSchowCaseTarget> elements;
    static ShowcaseView sv;

    int svStep = 0;
    RelativeLayout.LayoutParams svButtonParams;
    TextView tvSvTitle, tvSvDetail;
    View additional_view = null;
    Handler mHandler;


    //SHOWCASE THING************************************
    private View.OnClickListener showCaseListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sv.hideButton();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    showCaseSwitcher();
                    sv.showButton();
                }
            }, 50);
        }
    };


    public static frShowCase newInstance(ArrayList<xSchowCaseTarget> _elements) {
        frShowCase f = new frShowCase();
        Bundle args = new Bundle();
        elements = new ArrayList<xSchowCaseTarget>();
        sv = null;
        for (xSchowCaseTarget se : _elements) {
            elements.add(se);
        }
        is_sc_done = false;
        f.setArguments(args);
        return f;
    }

    public void svSetButtonPosition(cbActivity.position buttonPortraitPosition) {
        switch (buttonPortraitPosition) {
            case BOTTOM_LEFT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case BOTTOM_RIGHT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case TOP_LEFT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case TOP_RIGHT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case CENTER:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_IN_PARENT);
                svButtonParams.topMargin = 0;
                break;
            case FILL_BOTTOM:
                svButtonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case FILL_TOP:
                svButtonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case BOTTOM_CENTER:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case CENTER_TOP:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
        }
        sv.setButtonPosition(svButtonParams);
    }

    private void svSetUpOtherView() {
        sv.setContentTitle("");
        sv.setContentText("");
        additional_view = View.inflate(getActivity(), R.layout.showcase_text, null);
        RelativeLayout.LayoutParams lps = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lps.addRule(RelativeLayout.CENTER_IN_PARENT);
        tvSvTitle = (TextView) additional_view.findViewById(R.id.tvSvTitle);
        tvSvTitle.setText(elements.get(svStep).title);
        tvSvDetail = (TextView) additional_view.findViewById(R.id.tvSvDetailText);
        tvSvDetail.setText(elements.get(svStep).description);
        sv.addView(additional_view, 0, lps);
    }

    private void showCaseSwitcher() {
        if (svStep < elements.size()) {
            if (additional_view != null)
                sv.removeView(additional_view);

            sv.setShowcase(elements.get(svStep).target, true);
            svSetButtonPosition(elements.get(svStep).b_pos);

            if (elements.get(svStep).use_splashscreen) {
                svSetUpOtherView();
            } else {
                sv.setContentTitle(elements.get(svStep).title);
                sv.setContentText(elements.get(svStep).description);
            }

            svStep++;
        } else {
            ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
            for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(true);

            sv.hide();
            if (elements.get(svStep - 1).title.equals(getString(R.string.sv_intention_addweek_title))) {
                final Message m1 = mHandler.obtainMessage(123);
                mHandler.sendMessage(m1);
            }

            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
        }
    }

    public void setHandler(Handler handler) {
        this.mHandler = handler;
    }

    @Override
    public void onAttach(Activity ac) {
        super.onAttach(ac);
        Log.d("123", "onattach");

    }


    private List<View> getAllChildrenBFS(View v) {
        List<View> visited = new ArrayList<View>();
        List<View> unvisited = new ArrayList<View>();
        unvisited.add(v);

        while (!unvisited.isEmpty()) {
            View child = unvisited.remove(0);
            visited.add(child);
            if (!(child instanceof ViewGroup)) continue;
            ViewGroup group = (ViewGroup) child;
            final int childCount = group.getChildCount();
            for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
        }

        return visited;
    }

    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        Log.d("123", "oncreate");
    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //SHOWCASE INITIALIZATION THING*************************************************************

        if (!is_sc_done && frShowCase.elements != null) {
            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
                boolean isScreenOn = pm.isScreenOn();
                if (isScreenOn) {
                    is_sc_done = true;

                    ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
                    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(false);

                    cbActivity.BoolToPref(getActivity().getLocalClassName(), false);

                    sv = new ShowcaseView.Builder(getActivity())
                            .setTarget(frShowCase.elements.get(0).target)
                            .setContentTitle(frShowCase.elements.get(svStep).title)
                            .setContentText(frShowCase.elements.get(svStep).description)
                            .setStyle(R.style.CustomShowcaseTheme)
                            .setOnClickListener(showCaseListener)
                            .build();

                    if (elements.get(svStep).use_splashscreen)
                        svSetUpOtherView();


                    svSetButtonPosition(frShowCase.elements.get(0).b_pos);
                    sv.setButtonText(getActivity().getString(R.string.next));

                    svStep++;
                }
            }
            return sv;
        }
        //**************************************************************************************
        return container;
    }

}

这是我用于将TargetsActivities传递到该片段的Targets

xShowCaseTargets.java

 import com.github.amlcurran.showcaseview.targets.Target;

    /**
     * Created by Movsar Bekaev on 15/09/2015.
     */
    public class xSchowCaseTarget{
        protected cbActivity.position b_pos = cbActivity.position.BOTTOM_RIGHT;
        protected Target target = null;
        protected String title = "";
        protected String description = "";
        protected boolean use_splashscreen = false;

        public xSchowCaseTarget(Target target, String title, String desc, cbActivity.position position, Boolean useSplash) {
            this.b_pos = position;
            this.target = target;
            this.title = title;
            this.description = desc;
            this.use_splashscreen = useSplash;
        }

        public xSchowCaseTarget(Target target, String title, String desc, cbActivity.position position) {
            this.b_pos = position;
            this.target = target;
            this.title = title;
            this.description = desc;
            this.use_splashscreen = false;
        }    
    }

这是ShowCaseView的自定义布局的xml,当默认布局不能完成他的工作时(文本从屏幕上移开,按钮不在那里,等等)

showcase_text.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/scvShowCase" >

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/welcome"
                android:id="@+id/tvSvTitle"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="50dp"
                android:textColor="?attr/color_7"
                android:textSize="@dimen/h1_size"
                android:textStyle="bold" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/welcome_text"
                android:id="@+id/tvSvDetailText"
                android:layout_gravity="center_horizontal"
                android:textColor="?attr/color_4"
                android:layout_marginTop="30dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:textSize="@dimen/text_normal_size"
                android:gravity="center" />
        </LinearLayout>
    </ScrollView>

</FrameLayout>

至于cbActivity.BoolFromPref(getLocalClassName(), false) - 我使用共享偏好来检查这个Activity是否已经启动,所以这行检查这个值,同样在Fragment的代码中你看到在演示时阻止所有布局视图,如果你不需要它 - 不要叫那个。

如果您需要使用自定义视图,则在创建Target时添加“true”,如下所示:

svElements.add(new xSchowCaseTarget(Target.NONE, getString(R.string.welcome), getString(R.string.welcome_text), position.FILL_BOTTOM, true));

最后一点是,cbActivity - 活动的mybase类,我在这里使用它作为常用方法和变量的引用,所以位置枚举在该类中声明,它看起来像:

 public enum position {TOP_RIGHT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT, CENTER, BOTTOM_CENTER, CENTER_TOP, FILL_BOTTOM, FILL_TOP}

以下是我如何从Activities调用ShowcaseView的示例:

 if (cbActivity.BoolFromPref(getLocalClassName(), false)) {
            ArrayList<xSchowCaseTarget> svElements = new ArrayList<xSchowCaseTarget>();
            svElements.add(new xSchowCaseTarget(Target.NONE, getString(R.string.welcome), getString(R.string.welcome_text), position.FILL_BOTTOM, true));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.string.xxx), position.BOTTOM_LEFT));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.xxx), position.BOTTOM_RIGHT));
            if (isThereActionMenuButton())
                svElements.add(new xSchowCaseTarget(new ActionViewTarget(ActMain.this, ActionViewTarget.Type.OVERFLOW), getString(R.string.xxx), getString(R.string.xxx), position.FILL_BOTTOM));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.string.xxx), position.CENTER));

            frShowCase frSC = frShowCase.newInstance(svElements);
            fm.beginTransaction().add(frSC , "xxx").commit();
        }

I solved the problem through adding a child view to ShowCaseView.

UPD,

I've been asked to share the solution, so I'll share with all code that I use.

Here's my complete code as to using ShowCaseView: I use a Fragment to show it, therefore I don't need to copy code in every time, also I made some improvements to make life easier using it:

frShowCase.java:

/**
 * Created by Movsar Bekaev on 02/09/2015.
 */
public class frShowCase extends Fragment {
    static boolean is_sc_done;
    static ArrayList<xSchowCaseTarget> elements;
    static ShowcaseView sv;

    int svStep = 0;
    RelativeLayout.LayoutParams svButtonParams;
    TextView tvSvTitle, tvSvDetail;
    View additional_view = null;
    Handler mHandler;


    //SHOWCASE THING************************************
    private View.OnClickListener showCaseListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sv.hideButton();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    showCaseSwitcher();
                    sv.showButton();
                }
            }, 50);
        }
    };


    public static frShowCase newInstance(ArrayList<xSchowCaseTarget> _elements) {
        frShowCase f = new frShowCase();
        Bundle args = new Bundle();
        elements = new ArrayList<xSchowCaseTarget>();
        sv = null;
        for (xSchowCaseTarget se : _elements) {
            elements.add(se);
        }
        is_sc_done = false;
        f.setArguments(args);
        return f;
    }

    public void svSetButtonPosition(cbActivity.position buttonPortraitPosition) {
        switch (buttonPortraitPosition) {
            case BOTTOM_LEFT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case BOTTOM_RIGHT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case TOP_LEFT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case TOP_RIGHT:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case CENTER:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_IN_PARENT);
                svButtonParams.topMargin = 0;
                break;
            case FILL_BOTTOM:
                svButtonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case FILL_TOP:
                svButtonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
            case BOTTOM_CENTER:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                svButtonParams.topMargin = 0;
                break;
            case CENTER_TOP:
                svButtonParams = new RelativeLayout.LayoutParams((int) getActivity().getResources().getDimension(R.dimen.btns_width), (int) getActivity().getResources().getDimension(R.dimen.btns_heigh));
                svButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                svButtonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                svButtonParams.topMargin = (int) getActivity().getResources().getDimension(R.dimen.btns_heigh);
                break;
        }
        sv.setButtonPosition(svButtonParams);
    }

    private void svSetUpOtherView() {
        sv.setContentTitle("");
        sv.setContentText("");
        additional_view = View.inflate(getActivity(), R.layout.showcase_text, null);
        RelativeLayout.LayoutParams lps = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lps.addRule(RelativeLayout.CENTER_IN_PARENT);
        tvSvTitle = (TextView) additional_view.findViewById(R.id.tvSvTitle);
        tvSvTitle.setText(elements.get(svStep).title);
        tvSvDetail = (TextView) additional_view.findViewById(R.id.tvSvDetailText);
        tvSvDetail.setText(elements.get(svStep).description);
        sv.addView(additional_view, 0, lps);
    }

    private void showCaseSwitcher() {
        if (svStep < elements.size()) {
            if (additional_view != null)
                sv.removeView(additional_view);

            sv.setShowcase(elements.get(svStep).target, true);
            svSetButtonPosition(elements.get(svStep).b_pos);

            if (elements.get(svStep).use_splashscreen) {
                svSetUpOtherView();
            } else {
                sv.setContentTitle(elements.get(svStep).title);
                sv.setContentText(elements.get(svStep).description);
            }

            svStep++;
        } else {
            ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
            for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(true);

            sv.hide();
            if (elements.get(svStep - 1).title.equals(getString(R.string.sv_intention_addweek_title))) {
                final Message m1 = mHandler.obtainMessage(123);
                mHandler.sendMessage(m1);
            }

            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
        }
    }

    public void setHandler(Handler handler) {
        this.mHandler = handler;
    }

    @Override
    public void onAttach(Activity ac) {
        super.onAttach(ac);
        Log.d("123", "onattach");

    }


    private List<View> getAllChildrenBFS(View v) {
        List<View> visited = new ArrayList<View>();
        List<View> unvisited = new ArrayList<View>();
        unvisited.add(v);

        while (!unvisited.isEmpty()) {
            View child = unvisited.remove(0);
            visited.add(child);
            if (!(child instanceof ViewGroup)) continue;
            ViewGroup group = (ViewGroup) child;
            final int childCount = group.getChildCount();
            for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
        }

        return visited;
    }

    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        Log.d("123", "oncreate");
    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //SHOWCASE INITIALIZATION THING*************************************************************

        if (!is_sc_done && frShowCase.elements != null) {
            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
                boolean isScreenOn = pm.isScreenOn();
                if (isScreenOn) {
                    is_sc_done = true;

                    ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
                    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(false);

                    cbActivity.BoolToPref(getActivity().getLocalClassName(), false);

                    sv = new ShowcaseView.Builder(getActivity())
                            .setTarget(frShowCase.elements.get(0).target)
                            .setContentTitle(frShowCase.elements.get(svStep).title)
                            .setContentText(frShowCase.elements.get(svStep).description)
                            .setStyle(R.style.CustomShowcaseTheme)
                            .setOnClickListener(showCaseListener)
                            .build();

                    if (elements.get(svStep).use_splashscreen)
                        svSetUpOtherView();


                    svSetButtonPosition(frShowCase.elements.get(0).b_pos);
                    sv.setButtonText(getActivity().getString(R.string.next));

                    svStep++;
                }
            }
            return sv;
        }
        //**************************************************************************************
        return container;
    }

}

Here is a class for targets I use to pass Targets from Activities to that Fragment

xShowCaseTargets.java

 import com.github.amlcurran.showcaseview.targets.Target;

    /**
     * Created by Movsar Bekaev on 15/09/2015.
     */
    public class xSchowCaseTarget{
        protected cbActivity.position b_pos = cbActivity.position.BOTTOM_RIGHT;
        protected Target target = null;
        protected String title = "";
        protected String description = "";
        protected boolean use_splashscreen = false;

        public xSchowCaseTarget(Target target, String title, String desc, cbActivity.position position, Boolean useSplash) {
            this.b_pos = position;
            this.target = target;
            this.title = title;
            this.description = desc;
            this.use_splashscreen = useSplash;
        }

        public xSchowCaseTarget(Target target, String title, String desc, cbActivity.position position) {
            this.b_pos = position;
            this.target = target;
            this.title = title;
            this.description = desc;
            this.use_splashscreen = false;
        }    
    }

This is the xml for custom layout for ShowCaseView to use when default one won't do his job (text go off from the screen, button not there where it should be and etc.)

showcase_text.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/scvShowCase" >

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/welcome"
                android:id="@+id/tvSvTitle"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="50dp"
                android:textColor="?attr/color_7"
                android:textSize="@dimen/h1_size"
                android:textStyle="bold" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/welcome_text"
                android:id="@+id/tvSvDetailText"
                android:layout_gravity="center_horizontal"
                android:textColor="?attr/color_4"
                android:layout_marginTop="30dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:textSize="@dimen/text_normal_size"
                android:gravity="center" />
        </LinearLayout>
    </ScrollView>

</FrameLayout>

As to cbActivity.BoolFromPref(getLocalClassName(), false) - I use shared preferences to check whether or not this Activity has been started, so this line checks this value, also in Fragment's code you see blocking all views of layout while presentation, if you don't need it - don't call that.

If you need to use custom view, you add "true" when creating a Target like this:

svElements.add(new xSchowCaseTarget(Target.NONE, getString(R.string.welcome), getString(R.string.welcome_text), position.FILL_BOTTOM, true));

And the last thing is, the cbActivity - mybase class for Activities, I use it here as reference to the common methods and vars, so the position enum is declared in that class, and it looks like:

 public enum position {TOP_RIGHT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT, CENTER, BOTTOM_CENTER, CENTER_TOP, FILL_BOTTOM, FILL_TOP}

Here is an example of how I call ShowcaseView from Activities:

 if (cbActivity.BoolFromPref(getLocalClassName(), false)) {
            ArrayList<xSchowCaseTarget> svElements = new ArrayList<xSchowCaseTarget>();
            svElements.add(new xSchowCaseTarget(Target.NONE, getString(R.string.welcome), getString(R.string.welcome_text), position.FILL_BOTTOM, true));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.string.xxx), position.BOTTOM_LEFT));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.xxx), position.BOTTOM_RIGHT));
            if (isThereActionMenuButton())
                svElements.add(new xSchowCaseTarget(new ActionViewTarget(ActMain.this, ActionViewTarget.Type.OVERFLOW), getString(R.string.xxx), getString(R.string.xxx), position.FILL_BOTTOM));
            svElements.add(new xSchowCaseTarget(new ViewTarget(R.id.xxx, ActMain.this), getString(R.string.xxx), getString(R.string.xxx), position.CENTER));

            frShowCase frSC = frShowCase.newInstance(svElements);
            fm.beginTransaction().add(frSC , "xxx").commit();
        }

相关问答

更多
  • 是的,Google有一个地方可以获取有关公共交通的信息。 首先,您需要检查您的城市是否受支持: https://maps.google.com/landing/transit/cities/ 那么,如果支持,您可以在这里获得更多信息: https://maps.google.com/landing/transit/index.html 要以编程方式访问它,您可以同时使用以下API: https://developers.google.com/transit/ https://developers.googl ...
  • 1)使所有复制元素显示为“内联”,而不是内联块(因此它们的工作方式类似于跨度而不是div) 2)通过将其显示设置为无,在打开详细信息时隐藏摘要元素“更多...”。 代码如下: blockquote { display: inline; } details { display: inline; } summary { display: inline; } details[open] summary { display: none; }
  • 右键单击文本字段并选择属性,然后选择“如果空白则禁止”。 希望这会奏效 除了抑制选项,您将看到公式按钮。 单击它并将公式写为 如果数据库字段名称= null 如果有帮助,请告诉我 Right click on textfield and select properties and select suppress if blank. Hope this will work Beside suppress option you will see formula button. Click it and writ ...
  • 只是把这是你的CSS ul.sidenav-ul { width: 237px; } 这是快速脏的有效修复,会发生的是当position: fixed开始时,元素被取消上下文(这就是为什么你有z-index)所以你可以在某种程度上把它想象成3D。 你的词缀有width: 100%和position: static; 并且因为它永远不会超过视口,但是它们可以使用absolute, fixed, relative ,并且文本拉伸整个容器。 将文本整个列表限制为某个宽度将使所有内部元素保持不变,因此您的文本看起来 ...
  • 试试吧 $("table.grid tbody tr td:first-child").hover(function () { $(".ActivityDetails" + $(this).text()).toggle() }); 要么 $("table.grid tbody tr td:first-child").hover(function () { $(".ActivityDetails" + $(this).text()).show() },function () { $( ...
  • 使用不变的destination.txt和您提供的数据,以下内容可能会有所帮助: @Echo Off Set "sD=C:\X\Y\Z\SOURCE" Set "sF=destination.txt" For /F "UseBackQ Delims=" %%A In ("%sF%" ) Do For %%B In ("%%~fA.") Do echo=XCopy/IY "%sD%\%%~nxB" "%%~dpA." 2>Nul Pause 您只需要修改第3行和第4行的变量内容 注意 : 我目前已经完成 ...
  • 我通过向ShowCaseView添加子视图解决了这个问题。 UPD , 我被要求分享解决方案,所以我将与我使用的所有代码共享。 这是我使用ShowCaseView完整代码:我使用Fragment来显示它,因此我不需要每次都复制代码,我也做了一些改进,使生活更轻松: frShowCase.java: /** * Created by Movsar Bekaev on 02/09/2015. */ public class frShowCase extends Fragment { static b ...
  • 好的,经过大量调试后我发现错误...在JSON换行文件中我们有两个相似的属性: uuid:“XXX ......”uuId:“XXX ......” 这已经存在了一段时间,所以我认为bigquery中的一些变化开始要求密钥是唯一的而不管大小写。 将测试更多并确认! OK, after loads of debugging I found the error... in the JSON Newline file we had two attributes that were similar: uuid: " ...
  • 最后因为我们将始终控制客户端数据库,所以我设置了一个散列的秘密公式,然后用作数据库密码和用户名。 In the end as we will always control client database, I set up a secret formula that is hashed and then used as the database password and username.
  • 找到以下解决方案 在详细信息部分中为字段创建运行总计,并且运行总计应该是这样的。 1. Field to summarize should be Database Field, Type of summary should be "Count". 2. Evaluate for each record. 3. Reset for change of Group 现在你得到了该组中的记录数。 要压缩最后一条记录的行,请转到详细信息b supress公式编辑器并提供以下代码。 使用插入摘要获取详细信息部分 ...

相关文章

更多

最新问答

更多
  • h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
  • 创建一个功能(Create a function)
  • 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
  • PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
  • Qt冻结循环的原因?(Qt freezing cause of the loop?)
  • TableView重复youtube-api结果(TableView Repeating youtube-api result)
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
  • 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
  • 以编程方式创建UITableView(Creating a UITableView Programmatically)
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
  • Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
  • 设置kotlin扩展名(Setting a kotlin extension)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 如何在vim中启用python3?(How to enable python3 in vim?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • dedecms如何安装?
  • 在哪儿学计算机最好?
  • 学php哪个的书 最好,本人菜鸟
  • 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
  • 如何覆盖错误堆栈getter(How to override Error stack getter)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
  • 电脑高中毕业学习去哪里培训
  • 正则表达式验证SMTP响应(Regex to validate SMTP Responses)