android [java.lang.NoClassDefFoundError:android.widget.Toolbar]

时间:2015-07-23 07:14:29

标签: android android-toolbar

我在列表视图活动中创建了一个工具栏。我使用了以下代码:

public class Home extends ListActivity {

    private ProgressDialog pDialog;

    // URL to get contacts JSON
    private static String url = "http://api-11hr.anovatesoft.com/v1/list";

    // JSON Node names
    private static final String TAG_CONTACTS = "contacts";
    private static final String TAG_USERNAME = "username";
    private static final String TAG_NAME = "name";
    private static final String TAG_EMAIL = "email";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_CONTACT_NUMBER = "contactnumber";
    private static final String TAG_POSTAL_CODE = "postalcode";
    private static final String TAG_IMAGE = "image";
    SessionManager session;
    private double latitude;
    private double longitude;
    private String apikey;
    private String status;
    GPSTracker gps;

    private Toolbar toolbar;                              // Declaring the Toolbar Object

    // contacts JSONArray
    JSONArray contacts = null;

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

        toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
        setActionBar(toolbar);                   // Setting toolbar as the ActionBar with setSupportActionBar() call

        // get action bar
      /*  ActionBar actionBar = getActionBar();
        getActionBar().setHomeButtonEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);*/



        AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(
                Home.this);

// Setting Dialog Title
        alertDialog2.setTitle("Too quiet?");

// Setting Dialog Message
        alertDialog2.setMessage("Follow your favourite merchants and see what deals they're launching at the 11th Hour!");



// Setting Positive "Yes" Btn
        alertDialog2.setPositiveButton("YES",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // Write your code here to execute after dialog

                        dialog.cancel();

                    }
                });

        alertDialog2.show();


        Gps_func();


        // Session class instance
        session = new SessionManager(getApplicationContext());

        // get user data from session
        HashMap<String, String> user = session.getUserDetails();


        // apikey
        // Calling Application class (see application tag in AndroidManifest.xml)
        final GlobalClass globalVariable = (GlobalClass) getApplicationContext();

        //Set name and email in global/application context
        apikey = globalVariable.getApikey();


        latitude = globalVariable.getLatitude();
        longitude = globalVariable.getLongitude();
        status = globalVariable.getStatus();



        contactList = new ArrayList<HashMap<String, String>>();

        ListView lv = getListView();

        // Listview on item click listener
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem

                String cost = ((TextView) view.findViewById(R.id.email))
                        .getText().toString();


                // Starting single contact activity
                Intent in = new Intent(getApplicationContext(),
                        Adds.class);

                in.putExtra(TAG_EMAIL, cost);

                startActivity(in);

            }
        });

        // Calling async task to get json
        new GetContacts().execute();
    }

    private void Gps_func() {

        gps = new GPSTracker(Home.this);

        // check if GPS enabled
        if (gps.canGetLocation()) {

            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();

            // \n is for new line
            //  Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
            Log.d("tag", "Longitude:\n" + longitude + "\n Latitude: \n" + latitude);

        } else {
            // can't get location
            // GPS or Network is not enabled
            // Ask user to enable GPS/network in settings
            gps.showSettingsAlert();

            if (gps.canGetLocation()) {
                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();

                // \n is for new line
                // Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                Log.d("tag", "Longitude:\n" + longitude + "\n Latitude: \n" + latitude);

            }
        }

    }


    @Override
    protected void onRestart() {
        super.onRestart();
        Gps_func();
    }



    /**
     * Async task class to get json by making HTTP call
     */
    private class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(Home.this);
            pDialog.setMessage("Please wait....");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // Creating service handler class instance
            ServiceHandler1 sh = new ServiceHandler1(apikey, latitude, longitude);


            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, ServiceHandler1.POST);

            Log.d("Response: ", "> " + jsonStr);


            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    contacts = jsonObj.getJSONArray(TAG_CONTACTS);

                    // looping through All Contacts
                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);

                        String username = c.getString(TAG_USERNAME);
                        String name = c.getString(TAG_NAME);
                        String email = c.getString(TAG_EMAIL);
                        String address = c.getString(TAG_ADDRESS);
                        String gender = c.getString(TAG_CONTACT_NUMBER);
                        String postalcode = c.getString(TAG_POSTAL_CODE);


                        // tmp hashmap for single contact
                        HashMap<String, String> contact = new HashMap<String, String>();

                        // adding each child node to HashMap key => value

                        contact.put(TAG_EMAIL, email);


                        // adding contact to contact list
                        contactList.add(contact);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }

            return null;
        }


        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             * */
            ListAdapter adapter = new SimpleAdapter(
                    Home.this, contactList,
                    R.layout.list_item1, new String[]{TAG_EMAIL,
            }, new int[]{
                    R.id.email,});

            setListAdapter(adapter);
        }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // 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_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

但是当我运行应用程序时,它会出错:

  

java.lang.NoClassDefFoundError:android.widget.Toolbar

请帮我拿出工具栏

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"



    defaultConfig {
        applicationId "com.example.kmi_dev.fbloginsample"
        minSdkVersion 11
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories {
    mavenCentral()
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'
}

tool_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/ColorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:elevation="4dp"

    >

</android.support.v7.widget.Toolbar>

列表布局包括tool_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <!-- Main ListView
         Always give id value as list(@android:id/list)


    -->
    <include
        android:id="@+id/tool_bar"
        layout="@layout/tool_bar"
        ></include>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>

5 个答案:

答案 0 :(得分:4)

此错误表示您要转换Toolbar R.id.tool_bar。在您的布局中,Toolbarandroid.support.v7.widget.Toolbar,但在Home中,您希望将其投放到android.widget.Toolbar。因此,请检查导入,确保导入的Toolbarandroid.support.v7.widget.Toolbar

P.S.:如果它不起作用,清理或重建你的项目。

答案 1 :(得分:1)

工具栏包含在支持库中。直到我的知识工具栏应该从

导入
android.support.v7.widget.Toolbar

不是这个

 android.widget.Toolbar

所以我想请你在build.gradle中添加V7支持库的工具栏:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // Android Support Libraries
    compile 'com.android.support:appcompat-v7:22.2.0'

    }

答案 2 :(得分:1)

首先,进行任何布局,然后在其中放置该工具栏。

使用27 SDK不要使用修订版28.0.0 Alphas版本,它有一个我遇到的错误。 如果您想使用最新的SDK,请在alphas之后使用beta版本,例如beta。 稳定版本之后,就可以使用了。

答案 3 :(得分:0)

如果您使用API​​级别&lt; 21在设备上你应该使用支持库中的android.support.v7.widget.Toolbar

答案 4 :(得分:0)

根据Java文档java.lang.NoClassDefFoundError:Runtime error而不是compileTimeError。而error只是因为你的类能够在编译时找到但在程序执行时(运行模式)此课程未由virtual machine查找。因此,现在已清除您的必修课在compile()时找到,但在execute()时找不到。 享受你的代码:) -