Autore Topic: ListView DrawerList NPE  (Letto 527 volte)

Offline ZioArnold

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsug Galaxy S2 - GT 9100
  • Sistema operativo:
    Windows 10 Pro
ListView DrawerList NPE
« il: 21 Ottobre 2015, 17:30:00 CEST »
0
Buon giorno!
Ottengo un NullPointerException il codice e logcat e' il seguente:
Codice: [Seleziona]
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime: FATAL EXCEPTION: main
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime: Process: com.example.arnold.itsosgadda, PID: 2683
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.arnold.itsosgadda/com.example.arnold.itsosgadda.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setOnItemClickListener(android.widget.AdapterView$OnItemClickListener)' on a null object reference
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setOnItemClickListener(android.widget.AdapterView$OnItemClickListener)' on a null object reference
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at com.example.arnold.itsosgadda.MainActivity.onCreate(MainActivity.java:115)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5937)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
10-21 15:10:14.023 2683-2683/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="48dp">

    <ImageView
       android:id="@+id/icon"
       android:layout_width="25dp"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_marginLeft="12dp"
       android:layout_marginRight="12dp"
       android:contentDescription="@string/desc_list_item_icon"
       android:layout_centerVertical="true" />

    <TextView
       android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:layout_toRightOf="@id/icon"
       android:minHeight="?android:attr/listPreferredItemHeightSmall"
       android:textAppearance="?android:attr/textAppearanceListItemSmall"
       android:gravity="center_vertical"
       android:paddingRight="40dp"
       tools:ignore="NewApi" />

    <TextView android:id="@+id/counter"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_centerVertical="true"
       android:layout_marginRight="8dp"/>

</RelativeLayout>
Codice (Java): [Seleziona]
package com.example.arnold.itsosgadda;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Locale;

import static android.view.Window.FEATURE_ACTION_BAR;
import static android.widget.Toast.LENGTH_LONG;
import static com.example.arnold.itsosgadda.R.array.nav_drawer_icons;
import static com.example.arnold.itsosgadda.R.array.nav_drawer_items;
import static com.example.arnold.itsosgadda.R.id.about_app;
import static com.example.arnold.itsosgadda.R.id.button_show_comunications;
import static com.example.arnold.itsosgadda.R.id.drawer_layout;
import static com.example.arnold.itsosgadda.R.id.e_registryId;
import static com.example.arnold.itsosgadda.R.id.feedback;
import static com.example.arnold.itsosgadda.R.id.findus;
import static com.example.arnold.itsosgadda.R.id.list_slidermenu;
import static com.example.arnold.itsosgadda.R.id.specSectionButtonId;
import static com.example.arnold.itsosgadda.R.id.storyButton;
import static com.example.arnold.itsosgadda.R.layout.activity_main;
import static com.example.arnold.itsosgadda.R.menu.main_menu;
import static java.lang.Boolean.TYPE;

@SuppressWarnings({"ConstantConditions", "deprecation", "FieldCanBeLocal"})
@SuppressLint("NewApi")
public class MainActivity extends Activity implements View.OnClickListener, OnItemClickListener {

    @SuppressWarnings("FieldCanBeLocal")
    private Button storyButtonMainBody,
            specSectButton,
            webRegistryButton,
            feedBackButton,
            findUsButton,
            communicationButton;

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(activity_main);

        /**
         *
         *
         *
         *
         */


        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(drawer_layout);
        mDrawerList = (ListView) findViewById(list_slidermenu);

        navDrawerItems = new ArrayList<>();

        // adding nav drawer items to array
        // English language
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Russian language
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Italian language
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));


        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(this);

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
        /**
         *
         *
         *
         *
         */



        storyButtonMainBody = (Button) findViewById(storyButton);
        storyButtonMainBody.setOnClickListener(this);

        specSectButton = (Button) findViewById(specSectionButtonId);
        specSectButton.setOnClickListener(this);

        webRegistryButton = (Button) findViewById(e_registryId);
        webRegistryButton.setOnClickListener(this);

        feedBackButton = (Button) findViewById(feedback);
        feedBackButton.setOnClickListener(this);

        findUsButton = (Button) findViewById(findus);
        findUsButton.setOnClickListener(this);

        communicationButton = (Button) findViewById(R.id.button_show_comunications);
        communicationButton.setOnClickListener(this);
        makeActionOverflowMenuShown();
    }

    /*private class SlideMenuClickListener implements
            OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }*/


    /* *
     * Called when invalidateOptionsMenu() is triggered
     */

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     */

    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                Locale locale = new Locale("en");
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
            case 1:
                Locale locale2 = new Locale("ru");
                Locale.setDefault(locale2);
                Configuration config2 = new Configuration();
                config2.locale = locale2;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config2, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
            case 2:
                Locale locale3 = new Locale("it");
                Locale.setDefault(locale3);
                Configuration config3 = new Configuration();
                config3.locale = locale3;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config3, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
        }

        if (fragment != null) {

            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */


    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    /**
     *
     *
     *
     *
     */

    private void makeActionOverflowMenuShown() {
        //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
        try {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField != null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            Log.d(null, e.getLocalizedMessage());
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        if (featureId == FEATURE_ACTION_BAR && menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod(
                            "setOptionalIconsVisible", TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (NoSuchMethodException e) {
                    Log.e("MyActivity", "onMenuOpened", e);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return super.onMenuOpened(featureId, menu);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            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();
        switch (id) {
            case about_app:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setIcon(R.mipmap.ic_launcher)
                        .setTitle(R.string.created_for)
                        .setMessage(R.string.to_do_list)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show().setCanceledOnTouchOutside(true);
                AlertDialog dialog = builder.create();
                dialog.dismiss();
                break;
            case R.id.subscribe:
                TextView tvDisplay = new TextView(this);
                final String data = "- vkontakte: https://vk.com/arnold.charyyev\n" +
                        "- facebook: https://www.facebook.com/schyzomaniac.mind\n" +
                        "- youtube: https://www.youtube.com/user/Perceus100/\n" +
                        "- gmail: vl80tk@gmail.com\n" +
                        "- yandex: arn8109@yandex.com";
                tvDisplay.setText(data);
                tvDisplay.setLinksClickable(true);
                tvDisplay.setAutoLinkMask(RESULT_OK);
                tvDisplay.setMovementMethod(LinkMovementMethod.getInstance());
                Linkify.addLinks(tvDisplay, Linkify.ALL);

                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setIcon(R.mipmap.icon_subscribe_contact)
                        .setTitle(R.string.dev_contact)
                        .setView(tvDisplay)
                        .setCancelable(false)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                AlertDialog dialogAlert = alert.create();
                dialogAlert.dismiss();
                break;

        }
        return super.onOptionsItemSelected(item);
    }

    private void restartActivity() {
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

    private void storyButtonClicked() {
        startActivity(new Intent(getApplicationContext(), StoryActivity.class));
    }

    private void specSectButtonClicked() {
        startActivity(new Intent(getApplicationContext(), SpecStorySectionActivity.class));
    }

    private void webRegistryButtonClicked() {
        startActivity(new Intent(getApplicationContext(), WebRegistryActivity.class));
    }

    private void feedbackMailToButtonClicked() {
        startActivity(new Intent(getApplicationContext(), EmailSendingActivity.class));
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case storyButton:
                storyButtonClicked();
                break;
            case specSectionButtonId:
                specSectButtonClicked();
                break;
            case e_registryId:
                webRegistryButtonClicked();
                break;
            case feedback:
                feedbackMailToButtonClicked();
                break;
            case findus:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setIcon(R.mipmap.ic_launcher)
                        .setTitle(R.string.created_for)
                        .setMessage(R.string.reaching_from_fornovo_FS)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                startActivity(new Intent(getApplicationContext(),
                                        MapsActivity.class));
                            }
                        })
                        .show().setCanceledOnTouchOutside(true);
                AlertDialog dialog = builder.create();
                dialog.dismiss();
                break;
            case button_show_comunications:
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                alertDialogBuilder.setIcon(R.mipmap.ic_launcher)
                        .setTitle(R.string.created_for)
                        .setMessage(R.string.click_ok_to_proceed)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                startActivity(new Intent(getApplicationContext(),
                                        CommunicationsActivity.class));
                            }
                        })
                        .show().setCanceledOnTouchOutside(true);
                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.dismiss();
                break;
        }
    }

    /**
     *
     */


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (position) {
            case 0:
                Locale locale = new Locale("en");
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
            case 1:
                Locale locale2 = new Locale("ru");
                Locale.setDefault(locale2);
                Configuration config2 = new Configuration();
                config2.locale = locale2;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config2, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
            case 2:
                Locale locale3 = new Locale("it");
                Locale.setDefault(locale3);
                Configuration config3 = new Configuration();
                config3.locale = locale3;
                getBaseContext()
                        .getResources()
                        .updateConfiguration(config3, getBaseContext()
                                .getResources()
                                .getDisplayMetrics());
                restartActivity();
                Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show();
                break;
        }
    }
}

Qualcuno sa come si potrebbe aggiustare?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 717
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:ListView DrawerList NPE
« Risposta #1 il: 23 Ottobre 2015, 14:23:38 CEST »
0
Nel layout manca il ListView con id "list_slidermenu".
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.