6

I was following this tutorial to the "T" but when I run the app I get the following message in the logcat. I'm not sure what is going wrong because the class should be there right?

Could not find method android.view.ViewAnimationUtils.createCircularReveal, referenced from method io.codetail.animation.ViewAnimationUtils.createCircularReveal

MainActivity:

    import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.Filter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.curtrostudios.testapp.network.AppConfig;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;


/**
 * Created by CurTro Studios on 2/22/2016.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private ProgressDialog dialog=null ;
    private String TAG="Main Activity";
    private String tag_json_arry = "json_array_req";
    private ProductsAdapter adapter;
    private ListView list;
    ArrayList<ProductRowData> rowdata;
    private SearchView searchView;
    private MenuItem myActionMenuItem;
    LinearLayout mRevealView;
    boolean hidden = true;
    private ImageButton gallery_btn, photo_btn, video_btn, audio_btn, location_btn, contact_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mRevealView = (LinearLayout) findViewById(R.id.reveal_items);
        mRevealView.setVisibility(View.GONE);

        gallery_btn = (ImageButton) findViewById(R.id.login_img_btn);
        photo_btn = (ImageButton) findViewById(R.id.info_img_btn);
        video_btn = (ImageButton) findViewById(R.id.share_img_btn);
        audio_btn = (ImageButton) findViewById(R.id.sortAtoZ);
        location_btn = (ImageButton) findViewById(R.id.sortDate);
        contact_btn = (ImageButton) findViewById(R.id.sortRegion);

        gallery_btn.setOnClickListener(this);
        photo_btn.setOnClickListener(this);
        video_btn.setOnClickListener(this);
        audio_btn.setOnClickListener(this);
        location_btn.setOnClickListener(this);
        contact_btn.setOnClickListener(this);

        list=(ListView)findViewById(R.id.productList);
        list.setTextFilterEnabled(true);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //Get item at position
                ProductRowData item = (ProductRowData)parent.getItemAtPosition(position);

                //Pass the image title and url to DetailsActivity
                Intent intent = new Intent(MainActivity.this, ProductDetail.class);
                intent.putExtra("sid", item.getSID());
                intent.putExtra("name", item.getName());
                intent.putExtra("image", item.getImageURL());
                intent.putExtra("thumb", item.getThumbURL());
                intent.putExtra("description", item.getDescription());
                intent.putExtra("rating", item.getRating());

                //Start details activity
                startActivity(intent);
            }
        });
        rowdata=new ArrayList<ProductRowData>();

        dialog= new ProgressDialog(this);

        dialog.setMessage("Loading...");
        dialog.show();

        JsonArrayRequest request = new JsonArrayRequest(AppConfig.URL_MAIN,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString()); try {
                            for(int i=0;i<response.length();i++){
                                String sid=response.getJSONObject(i).getString("sid");
                                String name=response.getJSONObject(i).getString("product_name");
                                String img;
                                String thumb = response.getJSONObject(i).getString("product_thumb");
                                String description = response.getJSONObject(i).getString("product_description");
                                String rating = response.getJSONObject(i).getString("product_rating");

                                img = response.getJSONObject(i).getString("product_pic");

                                rowdata.add(new ProductRowData(sid,name,img,thumb,description,rating));
                            }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        adapter=new ProductsAdapter(MainActivity.this, rowdata);
                        list.setAdapter(adapter);
                        dialog.dismiss();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
                dialog.dismiss();
            }
        });

        VolleyController.getInstance().addToRequestQueue(request, tag_json_arry);




    }

    @Override
    public void onClick(View v) {
        hidden = true;
        switch (v.getId()) {

            case R.id.login_img_btn:

                break;
            case R.id.info_img_btn:

                break;
            case R.id.share_img_btn:

                break;
            case R.id.sortAtoZ:

                break;
            case R.id.sortDate:

                break;
            case R.id.sortRegion:

                break;
        }
    }

    public void Info(){
        Intent info = new Intent(MainActivity.this,
                InfoActivity.class);
        startActivity(info);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        myActionMenuItem = menu.findItem(R.id.action_search);
        searchView = (SearchView) myActionMenuItem.getActionView();
        searchView.clearFocus();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }


            @Override
            public boolean onQueryTextChange(String newText) {
                Filter filter = adapter.getFilter();

                if (TextUtils.isEmpty(newText)) {
                    filter.filter("");
                } else {
                    filter.filter(newText);
                }
                return true;
            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.action_info:

                int cx = (mRevealView.getLeft() + mRevealView.getRight());
//                int cy = (mRevealView.getTop() + mRevealView.getBottom())/2;
                int cy = mRevealView.getTop();

                int radius = Math.max(mRevealView.getWidth(), mRevealView.getHeight());

                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {


                    SupportAnimator animator =
                            ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius);
                    animator.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator.setDuration(800);

                    SupportAnimator animator_reverse = animator.reverse();

                    if (hidden) {
                        mRevealView.setVisibility(View.VISIBLE);
                        animator.start();
                        hidden = false;
                    } else {
                        animator_reverse.addListener(new SupportAnimator.AnimatorListener() {
                            @Override
                            public void onAnimationStart() {

                            }

                            @Override
                            public void onAnimationEnd() {
                                mRevealView.setVisibility(View.INVISIBLE);
                                hidden = true;

                            }

                            @Override
                            public void onAnimationCancel() {

                            }

                            @Override
                            public void onAnimationRepeat() {

                            }
                        });
                        animator_reverse.start();

                    }
                } else {
                    if (hidden) {
                        Animator anim = android.view.ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius);
                        mRevealView.setVisibility(View.VISIBLE);
                        anim.start();
                        hidden = false;

                    } else {
                        Animator anim = android.view.ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, radius, 0);
                        anim.addListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                super.onAnimationEnd(animation);
                                mRevealView.setVisibility(View.INVISIBLE);
                                hidden = true;
                            }
                        });
                        anim.start();

                    }
                }

                return true;

            case android.R.id.home:
                supportFinishAfterTransition();
                return true;
            case R.id.action_search:
                return true;
            case R.id.action_share:
                return true;
        }
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        //int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        //if (id == R.id.action_search) {
        //    return true;
        //}
        //if (id == R.id.action_info) {
        //    return true;
        //}
        //if(id == R.id.action_share){
        //    //Share();
        //    return true;
        //}

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();

    }

    @Override
    protected void onPause() {
        super.onPause();

    }

}

And my main layout:

    <android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.curtrostudios.testapp.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?attr/actionBarSize">

    <io.codetail.widget.RevealFrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/reveal_items"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <!--row 1 -->

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#F0EFED"
                android:orientation="horizontal"
                android:padding="16dp">

                <!--Gallery Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/login_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_login" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Login" />
                </LinearLayout>

                <!--Photo Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/info_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_info" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Info" />
                </LinearLayout>

                <!--Video Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/share_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_share" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Share" />
                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#F0EFED"
                android:orientation="horizontal"
                android:padding="16dp">

                <!--Gallery Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortAtoZ"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_a_z" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="A to Z" />
                </LinearLayout>

                <!--Photo Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortDate"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_sort_date" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Date" />
                </LinearLayout>

                <!--Video Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortRegion"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_region" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Region" />
                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

    </io.codetail.widget.RevealFrameLayout>
    </FrameLayout>

    <include layout="@layout/content_main" />

</android.support.design.widget.CoordinatorLayout>

This is my build.gradle(app) file:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.myapp.testapp"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
    compile 'com.github.traex.rippleeffect:library:1.3'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.wrapp.floatlabelededittext:library:0.0.6'
    compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') {
        transitive = true
    }
    compile ('com.github.ozodrukh:CircularReveal:1.3.1@aar') {
        transitive = true;
    }
}

EDIT

This is within my build.gradle(project) file:

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
Steve C.
  • 1,333
  • 3
  • 19
  • 50

5 Answers5

2

For anyone else that may see this with the same issue of the reveal animation/menu not showing, this is how I solved the problem. It wasn't that the RevealFrameLayout wasn't showing, it was just showing behind everything else. So, as you can see in my layout below, I just moved the FrameLayout below all other content and it works flawlessly now.

Main Layout

    <android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.myapp.testapp.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    //Issue was solved by adding the FrameLayout here.
    //below all other content. Works perfectly now.
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <include layout="@layout/reveal_layout" />

    </FrameLayout>



</android.support.design.widget.CoordinatorLayout>
Steve C.
  • 1,333
  • 3
  • 19
  • 50
0

Check your imported library.

in my case,

import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;

It occurs no error.

myoungjin
  • 895
  • 1
  • 13
  • 27
  • Yeah I had checked and re-checked that initially and ensured I had the correct imports necessary. Thank you though. – Steve C. Mar 23 '16 at 07:01
0

As library has clearly mentioned that you should first add remote maven url:

repositories {
        maven {
            url "https://jitpack.io"
        }
    }

and then a library dependency:

compile ('com.github.ozodrukh:CircularReveal:1.3.1@aar') {
        transitive = true;
    }

now try building the project and sync the gradle! If this doesn't helps, change aar version to 1.1.1

compile ('com.github.ozodrukh:CircularReveal:1.1.1@aar') {
        transitive = true;
    }

see if it helps.

also I suggest you to read this blog if the problem still persists!

ishwor kafley
  • 938
  • 14
  • 32
  • add remote maven url in app level build.gradle not in project level – ishwor kafley Mar 23 '16 at 07:12
  • Tried again after adding maven to app level build.gradle and changed aar to 1.1.1. Still getting error Could not find method createCircularReveal and unable to resolve static method createCircularReveal from android.view.ViewAnimationUtils class. – Steve C. Mar 23 '16 at 07:19
  • there might be a problem with this library! you should register this issue in their github and see if they respond! – ishwor kafley Mar 23 '16 at 07:43
  • Did that prior to posting a SO question. :/ I also tried the link you gave and still get the same error. – Steve C. Mar 23 '16 at 07:48
  • I tried the link you posted as a separate test project with just the reveal view and it works flawlessly but still doesn't work with my project. :( – Steve C. Mar 23 '16 at 09:38
  • :D that means there is something wrong with your code! put logs and try fixing the issue in incremental order or paste the code in the description above! – ishwor kafley Mar 23 '16 at 09:44
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/107113/discussion-between-steve-c-and-ishwor-kafley). – Steve C. Mar 23 '16 at 09:58
0

Although, I was not able to figure out why you are getting the error because I haven't tried that library, but I think you can easily implement circular reveal without using the above library. Please have a look at Material-Animations, it has very neat working example for circular reveal which you can use easily.

Amit Tiwari
  • 3,684
  • 6
  • 33
  • 75
0

Let me guess, you are testing the code (and getting that error) on a pre-Lollipop device/emulator.

The class ViewAnimationUtils has been introduced in Android at SDK 21 (Lollipop).

Your minSdkVersion is 16. Have a look at this other question suggesting a support library to take back the circular reveal animation to Android 2.3. The library is CircularReveal. You'll have to fork io.codetail.animation.ViewAnimationUtils to use it.

EDIT: question didn't mention it was already using CircularReveal library -- actually can be seen by the log

referenced from method io.codetail.animation.ViewAnimationUtils.createCircularReveal

EDIT 2: after seeing the updated response and knowing from OP that the logcat is not an error but just a warning

This is not a problem at all. It's a Dalvik feature, it checks for missing classes / methods and warn you if it doesn't find them. It will not crash unless you actually try to call them.

OkHttp library has similar warning and you can see they also say you can ignore them.

As a side note, the CircularReveal library appear to use the @TargetApi annotation where it should use @SuppressLint("NewApi"). @TargetApi means you are supposed to call that method from that Api level only. Anyway this is not the cause for the warning since this information is only available at compile time.

Community
  • 1
  • 1
Daniele Segato
  • 12,314
  • 6
  • 62
  • 88
  • My device is running 4.4.2. I ran a separate project from Ishwors link in his answer and it ran just fine. The logcat isn't give me anymore details as to the issue. The separate test project, ran on the same device, gave the same logcat message yet still worked. :/ – Steve C. Mar 23 '16 at 10:36
  • I changed the min api to 15 but still don't see the animation/reveal. Any ideas what may be causing this? – Steve C. Mar 23 '16 at 11:27
  • You asked why of that warning not why it doesn't animate – Daniele Segato Mar 23 '16 at 11:32