Wizard Pager is a library that provides an example implementation of a Wizard UI on Android

Related tags

UI/UX WizardPager
Overview

Wizard Pager

Wizard Pager Screenshot

Wizard Pager is a library that provides an example implementation of a Wizard UI on Android, it's based of Roman Nurik's wizard pager (https://github.com/romannurik/android-wizardpager)

I've updated Roman's code to use the latest support library, it is now structured as a library project, and it's backwards compatible with Android 2.2

Download

WizardPager is ready to be used via jitpack.io. Simply add the following code to your root build.gradle:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

Now add the gradle dependency in your application's build.gradle:

dependencies {
    compile 'com.github.TechFreak:WizardPager:{latest_version}'
}

Usage

There is a sample implementation, so you can see how to add this library to your project. The example uses ActionBarCompat.

Developed By

License

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Deploy to maven central

    Deploy to maven central

    It would be really cool if the project could be deployed to maven central.

    Sonatype has hosting of open source maven repos: https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide http://jroller.com/holy/entry/releasing_a_project_to_maven

    opened by DDRBoxman 4
  • How to retrive the data ?

    How to retrive the data ?

    Hi,

    Thanks for this excellent library. After the wizard process I wanna store that data but I can't figure out how to save the data.

    Thanks in advance

    opened by AkshayChordiya 3
  • How to use ImagePage?

    How to use ImagePage?

    I am trying to add image page to wizard. Pick chooser/capture works, but I don't know how to handle activity's result or set page value.

    Thanks in advance!

    opened by Wirwing 2
  • Image duplication in ImageFragment

    Image duplication in ImageFragment

    I found, that if you place in your wizard pager amount of ImagePage, so when you will startActivityForResult returned result will overwrite every your image. I found the way to avoid this:

    Changing request codes to:

    private final int GALLERY_REQUEST_CODE = Math.abs((short) (hashCode() ^ (hashCode() >>> 16)) - 0);
    private final int CAMERA_REQUEST_CODE = Math.abs((short) (hashCode() ^ (hashCode() >>> 16)) - 1);
    

    This will make every ImageFragment unique. Later change onActivityResult for:

    if(requestCode == CAMERA_REQUEST_CODE) {
                if (resultCode == Activity.RESULT_OK) {
                    imageView.setImageURI(mNewImageUri);
                    writeResult();
                }
            } else if(requestCode == GALLERY_REQUEST_CODE) {
                if (resultCode == Activity.RESULT_OK && data != null) {
                    mNewImageUri = data.getData();
                    imageView.setImageURI(mNewImageUri);
                    writeResult();
                }
            }
    
    opened by antonshkurenko 1
  • Not able to import classes from WizardPager

    Not able to import classes from WizardPager

    I have added this project into my Android Studio like this:

    compile 'com.github.TechFreak:WizardPager:1.0.3'

    However, when I try to import some class, like: import com.tech.freak.wizardpager.model.AbstractWizardModel;

    Android Studio says it does not found the reference. I could only import com.tech.freak.wizardpager.R without errors. What could I be doing wrong?

    By the way, such a great wizard for Android! Simply the best I found on open-source community.

    opened by femosso 1
  • Loading from Sqlite

    Loading from Sqlite

    @TechFreak i've been working on this library for the past view days to create a student form. is there anyway i can load data from sqlite into the wizard and what the student select in the first page will determine what student see in the next page for MultipleFixedChoicePage and SingleFixedChoicePage??

    opened by samsoft00 1
  • Cannot use strings in model

    Cannot use strings in model

    All strings are in wizardpager but we cannot use a conext with getString because the initialization of the wizardmodel is static, so the application is not created yet :(

    opened by dalexanco 1
  • produce maven artifacts in library/build/mvn-repo/

    produce maven artifacts in library/build/mvn-repo/

    I modified library/build.gradle to produce maven artifacts in library/build/mvn-repo/, hoping this helps with #2. If you're opposed to the idea of publishing on Maven Central please consider publishing to github by creating a separate repository or special-case branch for the maven artifact. For an example of hosting maven artifacts on github please see: https://github.com/WhisperSystems/maven

    This pull also makes it easy for users to package and publish their own artifact of the project but personally I would prefer to use something packaged by the author :) thanks for the great project

    opened by rhodey 0
  • gradle cannot find WizardPager-1.0.3.aar

    gradle cannot find WizardPager-1.0.3.aar

    Hi! I know, this project is too old, but maybe something could change? Currently newest AS can not build project Maybe someone knows, how to fix? I tried to turn off jetify, added it to ignorelist, clean, invalidate.... but it doesn't help.

    1: Task failed with an exception.
    -----------
    * What went wrong:
    Execution failed for task ':app:dataBindingMergeDependencyArtifactsMyProjectDebug'.
    > Could not resolve all files for configuration ':app:MyProjectDebugCompileClasspath'.
       > Failed to transform WizardPager-1.0.3.aar (com.github.TechFreak:WizardPager:1.0.3) to match attributes {artifactType=android-databinding, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-api}.
          > Could not find WizardPager-1.0.3.aar (com.github.TechFreak:WizardPager:1.0.3).
            Searched in the following locations:
                https://jitpack.io/com/github/TechFreak/WizardPager/1.0.3/WizardPager-1.0.3.aar
    
    opened by djdance 1
  • How to get the current object id from MultipleFixedChoicePage?

    How to get the current object id from MultipleFixedChoicePage?

    Hello i have multiple fixed choice like below:

    ((MultipleFixedChoicePage) mWizardModel.findByKey("Items"))
          .setChoices(names)
          .getAdapter().notifyDataSetChanged();
    

    I cannot setId to each choice field. I just only can set the string name to display.

    When i pass to bundle like this: Bundle bundle = mWizardModel.save();

    I get the selected string by: List dealIdsString = bundle.getBundle("Items").getStringArrayList("_");

    The problem is i cannot get the selected id (additional property that i wanted to add). Please help. Thanks.

    opened by eternalBlast 0
  • implementing WizaredPager in a fragment : how to fix

    implementing WizaredPager in a fragment : how to fix "Activity must implement PageFragmentCallbacks" ?

    I'am trying to use wizaredPager in a fragment, and i got "Activity must implement PageFragmentCallbacks" exception . `

    public class CollectionDonneesFragment extends Fragment implements PageFragmentCallbacks, ReviewFragment.Callbacks, ModelCallbacks

    {
        private ViewPager mPager;
        private MyPagerAdapter mPagerAdapter;
    
        private boolean mEditingAfterReview;
    
        private AbstractWizardModel mWizardModel = new NotificationWizardModel(getContext());
    
        private boolean mConsumePageSelectedEvent;
    
        private Button mNextButton;
        private Button mPrevButton;
    
        private List<Page> mCurrentPageSequence;
        private StepPagerStrip mStepPagerStrip;
    
        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =inflater.inflate(R.layout.fragment_collection_donnees, container, false);
            if (savedInstanceState != null) {
                mWizardModel.load(savedInstanceState.getBundle("model"));
            }
    
            mWizardModel.registerListener(this);
    
            mPagerAdapter = new MyPagerAdapter(getFragmentManager());
            mPager = (ViewPager) view.findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);
            mStepPagerStrip = (StepPagerStrip) view.findViewById(R.id.strip);
            mStepPagerStrip
                    .setOnPageSelectedListener(new StepPagerStrip.OnPageSelectedListener() {
                        @Override
                        public void onPageStripSelected(int position) {
                            position = Math.min(mPagerAdapter.getCount() - 1,
                                    position);
                            if (mPager.getCurrentItem() != position) {
                                mPager.setCurrentItem(position);
                            }
                        }
                    });
    
            mNextButton = (Button) view.findViewById(R.id.next_button);
            mPrevButton = (Button) view.findViewById(R.id.prev_button);
    
            mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    mStepPagerStrip.setCurrentPage(position);
    
                    if (mConsumePageSelectedEvent) {
                        mConsumePageSelectedEvent = false;
                        return;
                    }
    
                    mEditingAfterReview = false;
                    updateBottomBar();
                }
            });
    
            mNextButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
                        DialogFragment dg = new DialogFragment() {
                            @Override
                            public Dialog onCreateDialog(Bundle savedInstanceState) {
                                return new AlertDialog.Builder(getActivity())
                                        .setMessage("Envoyer vos données ? Activez la reception des notification et suivez toutes les nouveautés de votre opérateur")
                                        .setPositiveButton(
                                                "Envoyer vos données",
                                                null)
                                        .setNegativeButton(android.R.string.cancel,
                                                null).create();
                            }
                        };
                        dg.show(getFragmentManager(), "place_order_dialog");
                    } else {
                        if (mEditingAfterReview) {
                            mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
                        } else {
                            mPager.setCurrentItem(mPager.getCurrentItem() + 1);
                        }
                    }
                }
            });
    
            mPrevButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mPager.setCurrentItem(mPager.getCurrentItem() - 1);
                }
            });
    
            onPageTreeChanged();
            updateBottomBar();
        return view;
    }
    
        @Override
        public void onPageTreeChanged() {
            mCurrentPageSequence = mWizardModel.getCurrentPageSequence();
            recalculateCutOffPage();
            mStepPagerStrip.setPageCount(mCurrentPageSequence.size() + 1); // + 1 =
            // review
            // step
            mPagerAdapter.notifyDataSetChanged();
            updateBottomBar();
        }
    
        private void updateBottomBar() {
            int position = mPager.getCurrentItem();
            if (position == mCurrentPageSequence.size()) {
                mNextButton.setText("Finir");
                mNextButton.setBackgroundResource(R.drawable.finish_background);
                mNextButton.setTextAppearance(getContext(), R.style.TextAppearanceFinish);
            } else {
                mNextButton.setText(mEditingAfterReview ? R.string.review
                        : R.string.next);
                mNextButton
                        .setBackgroundResource(R.drawable.selectable_item_background);
                TypedValue v = new TypedValue();
                getActivity().getTheme().resolveAttribute(android.R.attr.textAppearanceMedium, v,
                        true);
                mNextButton.setTextAppearance(getContext(), v.resourceId);
                mNextButton.setEnabled(position != mPagerAdapter.getCutOffPage());
            }
    
            mPrevButton
                    .setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
        }
    
    
    
    
    
        @Override
        public AbstractWizardModel onGetModel() {
            return mWizardModel;
        }
    
        @Override
        public void onEditScreenAfterReview(String key) {
            for (int i = mCurrentPageSequence.size() - 1; i >= 0; i--) {
                if (mCurrentPageSequence.get(i).getKey().equals(key)) {
                    mConsumePageSelectedEvent = true;
                    mEditingAfterReview = true;
                    mPager.setCurrentItem(i);
                    updateBottomBar();
                    break;
                }
            }
        }
    
        @Override
        public void onPageDataChanged(Page page) {
            if (page.isRequired()) {
                if (recalculateCutOffPage()) {
                    mPagerAdapter.notifyDataSetChanged();
                    updateBottomBar();
                }
            }
        }
    
        @Override
        public Page onGetPage(String key) {
            return mWizardModel.findByKey(key);
        }
    
        private boolean recalculateCutOffPage() {
            // Cut off the pager adapter at first required page that isn't completed
            int cutOffPage = mCurrentPageSequence.size() + 1;
            for (int i = 0; i < mCurrentPageSequence.size(); i++) {
                Page page = mCurrentPageSequence.get(i);
                if (page.isRequired() && !page.isCompleted()) {
                    cutOffPage = i;
                    break;
                }
            }
    
            if (mPagerAdapter.getCutOffPage() != cutOffPage) {
                mPagerAdapter.setCutOffPage(cutOffPage);
                return true;
            }
    
            return false;
        }
    
        public class MyPagerAdapter extends FragmentStatePagerAdapter {
            private int mCutOffPage;
            private Fragment mPrimaryItem;
    
            public MyPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int i) {
                if (i >= mCurrentPageSequence.size()) {
                    return new ReviewFragment();
                }
    
                return mCurrentPageSequence.get(i).createFragment();
            }
    
            @Override
            public int getItemPosition(Object object) {
                // TODO: be smarter about this
                if (object == mPrimaryItem) {
                    // Re-use the current fragment (its position never changes)
                    return POSITION_UNCHANGED;
                }
    
                return POSITION_NONE;
            }
    
            @Override
            public void setPrimaryItem(ViewGroup container, int position,
                                       Object object) {
                super.setPrimaryItem(container, position, object);
                mPrimaryItem = (Fragment) object;
            }
    
            @Override
            public int getCount() {
                return Math.min(mCutOffPage + 1, mCurrentPageSequence == null ? 1
                        : mCurrentPageSequence.size() + 1);
            }
    
            public void setCutOffPage(int cutOffPage) {
                if (cutOffPage < 0) {
                    cutOffPage = Integer.MAX_VALUE;
                }
                mCutOffPage = cutOffPage;
            }
    
            public int getCutOffPage() {
                return mCutOffPage;
            }
        }
    

    } and this is the logcatE/AndroidRuntime: FATAL EXCEPTION: main java.lang.ClassCastException: Activity must implement PageFragmentCallbacks at com.tech.freak.wizardpager.ui.SingleChoiceFragment.onAttach(SingleChoiceFragment.java:106) at android.support.v4.app.Fragment.onAttach(Fragment.java:1196) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1281) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1627) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637) at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) at android.support.v4.view.ViewPager.populate(ViewPager.java:1235) at android.support.v4.view.ViewPager.populate(ViewPager.java:1083) at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1609) at android.view.View.measure(View.java:12865) at android.widget.LinearLayout.measureVertical(LinearLayout.java:822) at android.widget.LinearLayout.onMeasure(LinearLayout.java:563) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) at android.view.View.measure(View.java:12865) at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1079) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385) at android.widget.LinearLayout.measureVertical(LinearLayout.java:670) at android.widget.LinearLayout.onMeasure(LinearLayout.java:563) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385) at android.widget.LinearLayout.measureVertical(LinearLayout.java:670) at android.widget.LinearLayout.onMeasure(LinearLayout.java:563) at android.view.View.measure(View.java:12865) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712) at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2242) at android.view.View.measure(View.java:12865) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1240) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2632) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4517) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) at dalvik.system.NativeStart.main(Native Method)`

    opened by SouilahTaha 0
  • java.lang.IllegalStateException: Recursive entry to executePendingTransactions when swap between branches

    java.lang.IllegalStateException: Recursive entry to executePendingTransactions when swap between branches

    I'm trying to implement this library by changing the sample. Currently I just changed WizardModel but didn't touch anything in MainActivity. I get an exception, I tried to google and I found that I have to change getSupportFragmentManager() to getChildFragmentManager() but I ain't able to do this, because I'm inside activity. Here's stacktrace:

    E/AndroidRuntime: FATAL EXCEPTION: main
    E/AndroidRuntime: Process: me.cullycross.example, PID: 16709
    E/AndroidRuntime: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1544)
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:545)
    E/AndroidRuntime:     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:930)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2907)
    E/AndroidRuntime:     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    E/AndroidRuntime:     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
    E/AndroidRuntime:     at me.cullycross.example.activities.OrderActivity.onPageDataChanged(OrderActivity.java:138)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.model.AbstractWizardModel.onPageDataChanged(AbstractWizardModel.java:52)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.model.Page.notifyDataChanged(Page.java:92)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.ui.TextFragment$1.afterTextChanged(TextFragment.java:97)
    E/AndroidRuntime:     at android.widget.TextView.sendAfterTextChanged(TextView.java:7679)
    E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:4056)
    E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:3905)
    E/AndroidRuntime:     at android.widget.EditText.setText(EditText.java:85)
    E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:3880)
    E/AndroidRuntime:     at android.widget.TextView.onRestoreInstanceState(TextView.java:3780)
    E/AndroidRuntime:     at android.view.View.dispatchRestoreInstanceState(View.java:13621)
    E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
    E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
    E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
    E/AndroidRuntime:     at android.view.View.restoreHierarchyState(View.java:13599)
    E/AndroidRuntime:     at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468)
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1053)
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1207)
    E/AndroidRuntime:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1572)
    E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:545)
    E/AndroidRuntime:     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:946)
    E/AndroidRuntime:     at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2907)
    E/AndroidRuntime:     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    E/AndroidRuntime:     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
    E/AndroidRuntime:     at me.cullycross.example.activities.OrderActivity.onPageTreeChanged(OrderActivity.java:150)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.model.AbstractWizardModel.onPageTreeChanged(AbstractWizardModel.java:61)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.model.BranchPage.notifyDataChanged(BranchPage.java:98)
    E/AndroidRuntime:     at com.tech.freak.wizardpager.ui.SingleChoiceFragment.onListItemClick(SingleChoiceFragment.java:122)
    E/AndroidRuntime:     at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
    E/AndroidRuntime:     at android.widget.AdapterView.performItemClick(AdapterView.java:300)
    E/AndroidRuntime:     at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
    E/AndroidRuntime:     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
    E/AndroidRuntime:     at android.widget.AbsListView$3.run(AbsListView.java:3833)
    E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
    E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
    E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
    E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
    E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    
    opened by antonshkurenko 4
  • Correct way to load dynamic content in wizard

    Correct way to load dynamic content in wizard

    In the sample code the AbstractWizardModel is being statically instantiated when MainActivity is created. Once this is done, the onNewRootPageList() callback is immediately triggered in the wizard model and I couldn't find a way to load the PageList with some dynamic contents.

    The workaround I found for this is to make AbstractWizardModel class a inner class in MainActivity and have my dynamic content a global variable so I could access it from AbstractWizardModel. This generates a side effect since I'm no longer instantiating AbstractWizardModel class when the MainActivity is create. I'm instantiating it o onCreate() callback, so it is being called some time later in comparison with original code.

    Is there an alternative way to load content in the form (PageList) dynamically?

    opened by femosso 2
Releases(1.0.3)
Owner
Julián Suárez
Julián Suárez
Android Material Json Form Wizard is a library for creating beautiful form based wizards within your app just by defining json in a particular format.

Android Json Wizard Android Json Wizard is a library for creating beautiful form based wizards within your app just by defining json in a particular f

Vijay Rawat 355 Nov 11, 2022
WizardTower - What will eventually be a Roguelike about being a powerful wizard, with a tower.

Wizard Tower Roguelike by sgibber2018 Description: This is a Roguelike I've been wanting to make for a long time. The premise is really simple: you ar

Sam Gibson 0 Jan 5, 2022
A library that provides an implementation of the banner widget from the Material design.

MaterialBanner A banner displays a prominent message and related optional actions. MaterialBanner is a library that provides an implementation of the

Sergey Ivanov 252 Nov 18, 2022
This library provides a simple way to add a draggable sliding up panel (popularized by Google Music and Google Maps) to your Android application. Brought to you by Umano.

Note: we are not actively responding to issues right now. If you find a bug, please submit a PR. Android Sliding Up Panel This library provides a simp

Umano: News Read To You 9.4k Dec 31, 2022
[] Android library that provides a file explorer to let users select files on external storage.

aFileChooser - Android File Chooser aFileChooser is an Android Library Project that simplifies the process of presenting a file chooser on Android 2.1

Paul Burke 1.8k Jan 5, 2023
Janishar Ali 2.1k Jan 1, 2023
Library and example project on how to use the UITableView component

UITableView for Android Usage Installation Android Studio Paste or clone this library into the /libs folder, in the root directory of your project. Cr

Thiago Locatelli 679 Nov 11, 2022
Xamarin.Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#

Xamarin.Android Xamarin.Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#. Build Status Platform

Xamarin 1.8k Jan 5, 2023
Provides 9-patch based drop shadow for view elements. Works on API level 9 or later.

Material Shadow 9-Patch This library provides 9-patch based drop shadow for view elements. Works on API level 14 or later. Target platforms API level

Haruki Hasegawa 481 Dec 19, 2022
The CustomCalendarView provides an easy and customizable calendar to create a Calendar. It dispaly the days of a month in a grid layout and allows to navigate between months

Custom-Calendar-View To use the CustomCalendarView in your application, you first need to add the library to your application. You can do this by eith

Nilanchala Panigrahy 113 Nov 29, 2022
a custom view that provides dragged and scaled

DragScaleCircleView A custom imageview that provides the circle window can be dragged and scaled, crop image. How does it look? Why? Sometimes need to

null 514 Dec 22, 2022
Sentinel is a simple one screen UI which provides a standardised entry point for tools used in development and QA alongside device, application and permissions data.

Sentinel Sentinel is a simple one screen UI that provides standardised entry point for tools used in development and QA alongside device, application

Infinum 29 Dec 12, 2022
Material Design implementation for Android 4.0+. Shadows, ripples, vectors, fonts, animations, widgets, rounded corners and more.

Carbon Material Design implementation for Android 4.0 and newer. This is not the exact copy of the Lollipop's API and features. It's a custom implemen

null 3k Dec 30, 2022
AndroidTreeView. TreeView implementation for android

AndroidTreeView Recent changes 2D scrolling mode added, keep in mind this comes with few limitations: you won't be able not place views on right side

Bogdan Melnychuk 2.9k Jan 2, 2023
Proof of concept Android WebView implementation based on Chromium code

Deprecation Notice This project is un-maintained. The recommended alternative is the Crosswalk Project. I did not have the time to keep the project up

Victor Costan 1.7k Dec 25, 2022
Fully customizable implementation of "Snowfall View" on Android.

Android-Snowfall Fully customizable implementation of "Snowfall View" on Android. That's how we use it in our app Hotellook Compatibility This library

Jetradar Mobile 1.2k Dec 21, 2022
This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementation of a lesson on the Pluralsight platform, but with some code improvements

NoteKeeper-Custom-Widgets This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementati

Ibrahim Mushtaha 3 Oct 29, 2022
Multi Roots TreeView implementation for Android Platform with a lot of options and customization

Multi roots TreeView :palm_tree: implementation for Android Platform with a lot of options and customization

Amr Hesham 112 Jan 3, 2023
An implementation of tap targets from the Material Design guidelines for feature discovery.

TapTargetView An implementation of tap targets from Google's Material Design guidelines on feature discovery. Min SDK: 14 JavaDoc Installation TapTar

Keepsafe 5.2k Dec 30, 2022