Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao executar

Assim que executo aparece o seguinte erro:

08-30 15:18:16.771 29148-29148/br.com.alura.agenda E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: br.com.alura.agenda, PID: 29148
                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.alura.agenda/br.com.alura.agenda.ListaAlunosActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2567)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2641)
                                                                         at android.app.ActivityThread.access$800(ActivityThread.java:182)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                         at android.os.Looper.loop(Looper.java:194)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5717)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
                                                                      Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                                         at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:347)
                                                                         at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:316)
                                                                         at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:281)
                                                                         at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
                                                                         at br.com.alura.agenda.ListaAlunosActivity.onCreate(ListaAlunosActivity.java:39)
                                                                         at android.app.Activity.performCreate(Activity.java:6092)
                                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2514)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2641) 
                                                                         at android.app.ActivityThread.access$800(ActivityThread.java:182) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                         at android.os.Looper.loop(Looper.java:194) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5717) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
4 respostas

Olá Lucas,

Aparentemente o erro tem a ver com o tema da aplicação e provavelmente com o uso da biblioteca de suporte.

Verifique se sua ListaAlunosActivity está extendendo a classe AppCompatActivity. Além disso, no arquivo res/values/styles.xml, verifique se o tema da aplicação tem como parent algum tema proveniente da biblioteca de suporte (o tema deve ter AppCompat no nome).

Caso não consiga identificar o erro, poste aqui o código do ListaAlunosActivity, seu AndroidManifest.xml e o arquivo res/values/styles.xml.

Jeferson obrigado pelo suporte mas não consegui resolver, este problema começou com a resolução dos exercícios dessa aula da API de Maps, segue código solicidato:

ListaAlunosActivity:

package br.com.alura.agenda;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.List;


import br.com.alura.agenda.adapter.AlunosAdapter;
import br.com.alura.agenda.converter.AlunoConverter;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.modelo.Aluno;

public class ListaAlunosActivity extends AppCompatActivity {

    private static final int CODIGO_LIGACAO = 123;
    private static final int CODIGO_SMS = 124;

    private ListView listaAlunos;

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

        //verifica permissão recebimento de SMS
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
                requestPermissions(new String[] { Manifest.permission.RECEIVE_SMS } , CODIGO_SMS);
            }
        }

        listaAlunos = (ListView) findViewById(R.id.lista_alunos);

        Button novoAluno = (Button) findViewById(R.id.novo_aluno);
        novoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                startActivity(intent);
            }
        });

        listaAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) { //AdapterView<?> adapterView = lista, View view = item, int i = posicao, long l = id

                Aluno aluno = (Aluno) lista.getItemAtPosition(position);

                Intent intent = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                intent.putExtra("aluno", aluno);
                startActivity(intent);
            }
        });

        //precisamos fazer com que o Android fique ciente da existência do menu de contexto
        registerForContextMenu(listaAlunos);
    }

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

        carregaLista();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) {

        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;

        final Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(info.position);

        //item site
        MenuItem itemSite = menu.add("Visitar site do aluno");
        Intent intentSite = new Intent(Intent.ACTION_VIEW);
        String site = aluno.getSite();
        if (!site.startsWith("http://")){
            site = "http://" + site;
        }
        intentSite.setData(Uri.parse(site));
        itemSite.setIntent(intentSite);

        //item ligação
        MenuItem itemLigar = menu.add("Ligar para aluno");
        itemLigar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                if (ActivityCompat.checkSelfPermission(ListaAlunosActivity.this, Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(ListaAlunosActivity.this, new String []{Manifest.permission.CALL_PHONE}, CODIGO_LIGACAO);
                } else{
                    Intent intentLigar = new Intent(Intent.ACTION_CALL);
                    intentLigar.setData(Uri.parse("tel:" + aluno.getTelefone()));
                    startActivity(intentLigar);
                }
                return false;
            }
        });

        //item sms
        MenuItem itemSMS = menu.add("Enviar SMS");
        Intent intentSMS = new Intent(Intent.ACTION_VIEW);
        intentSMS.setData(Uri.parse(("sms:" + aluno.getTelefone())));
        itemSMS.setIntent(intentSMS);

        //item maps
        MenuItem itemMapa = menu.add("Visualizar no mapa");
        Intent intentMapa = new Intent(Intent.ACTION_VIEW);
        intentMapa.setData(Uri.parse("geo:0,0?z=14&q=" + aluno.getEndereco()));
        itemMapa.setIntent(intentMapa);

        //item deletar
        MenuItem itemDeletar = menu.add("Deletar");
        itemDeletar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this);
                dao.deleta(aluno);
                dao.close();

                Toast.makeText(ListaAlunosActivity.this, aluno.getNome() + "removido(a)", Toast.LENGTH_SHORT).show();

                carregaLista();

                return false;
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater menuInflater = getMenuInflater();

        menuInflater.inflate(R.menu.menu_lista_alunos, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()){
            case R.id.menu_enviar_notas:
                new EnviaDadosServidor(this).execute();
                break;

            case R.id.menu_baixar_provas:
                Intent vaiParaProvas = new Intent(this, ProvasActivity.class);
                startActivity(vaiParaProvas);
                break;

            case R.id.menu_mapa:
                Intent vaiParaMapa = new Intent(this, MapsActivity.class);
                startActivity(vaiParaMapa);
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    private void carregaLista() {
        //        String[] alunos = {"Daniel", "Ronaldo", "Jeferson", "Felipe"};
        AlunoDAO dao = new AlunoDAO(this);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        AlunosAdapter adapter = new AlunosAdapter(this, alunos);

        listaAlunos.setAdapter(adapter);
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.alura.agenda">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />

    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality. 
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity" />

        <receiver
            android:name=".receiver.SmsReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name=".ProvasActivity" />
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"></activity>
    </application>

</manifest>

res/values/styles.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

Olá Lucas,

Não parece ter nada de errado com esses arquivos. Vamos tentar o arquivo de layout da ListaAlunosActivity que é o activity_lista_alunos.xml.

Além disso, dá uma olhada no SDK Manager e verifica qual a versão do Build Tools que você está utilizando. Também queria saber qual a versão do Android Studio que você está usando. Vamos ver se alguma dessas informações ajuda.

solução!

Oi Jeferson,

Gosto de fazer os testes emulando no meu próprio aparelho Smartphone pois assim agilizo no desempenho que demora muito pra carregar pelo PC. Porém fui testar na emulação do Android Studio que é a versão 2.1.3 e rodou tudo ok, e por curiosidade fui e fiz o teste pelo Smartphone de novo e voltou a funcionar! Que esquisito não ?!?!?! rsrsrs

Obrigado pela atenção!