17
respostas

Botão floatingAction não aparece

Boa tarde, já fiz a alteração do component Tree para RelativeLayout mas o botão não aparece, tentei mudar a cor dele mas mesmo assim ele não está visível, não consigo nem mesmo arrastá-lo porque não sei onde ele está.

Meu androidStudio é a versão 4.1

E agora a agenda não abre mais, só recebo a mensagem "Agenda keeps stopping"

Esse é o meu código main:

package br.com.alura.agenda;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<String> alunos = new ArrayList<>(Arrays.asList("Alex", "Fran", "José", "Maria", "Ana"));
        ListView listaDeAlunos = findViewById(R.id.activity_main_lista_de_alunos);
        listaDeAlunos.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, alunos));
    }
}

Esse é meu código AndroidManifest:

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Agenda" >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
17 respostas
No Component Tree aparecem 3 warnings e 1 error

Error: addView(View, LayoutParams) is not supported in AdapterView
    Exception raised during rendering: addView(View, LayoutParams) is not supported in AdapterView (Details)  
     Tip: Try to refresh the layout.

Warning: 'AdapterView cannot have children in XML
    A list/grid should have no children declared in XML  
    An AdapterView such as a `ListView`s must be configured with data from Java code, such as a ListAdapter.  
    Issue id: AdapterViewChildren https://developer.android.com/reference/android/widget/AdapterView.html

Warning: Image without 'contentDescription'
    Empty contentDescription attribute on image  
    Non-textual widgets like ImageViews and ImageButtons should use the contentDescription attribute to specify a textual description of the widget such that screen readers and other accessibility tools can adequately describe the user interface.  
    Note that elements in application screens that are purely decorative and do not provide any content or enable a user action should not have accessibility content descriptions. In this case, just suppress the lint warning with a tools:ignore="ContentDescription" attribute.  
    Note that for text fields, you should not set both the hint and the contentDescription attributes since the hint will never be shown. Just set the hint. See https://developer.android.com/guide/topics/ui/accessibility/apps#special-cases  Issue id: ContentDescription  

Warning: Hardcoded text
    Hardcoded string "TODO", should use @string resource  
    Hardcoding text attributes directly in layout files is bad for several reasons:           
* When creating configuration variations (for example for landscape or portrait) you have to repeat the actual text (and keep it up to date when making changes)  
* The application cannot be translated to other languages by just adding new translations for existing string resources.  
There are quickfixes to automatically extract this hardcoded string into a resource lookup.  Issue id: HardcodedText

Sergio, tudo bem ?

Consegue mostrar para gente o layout da sua activity?

Eu fiz a alteração para RelativeLayout, mas não mudou nada. Você quer um print screen no Github?

O XML do layout, pra gente ver se tem algum erro.

Segue:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.Agenda" >
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

Esse é do app, chamado manifest.

Quero o layout, que fica na pasta res.

Segue.

<ListView
    android:id="@+id/activity_main_lista_de_alunos"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:contentDescription="TODO"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="#F44336"
        app:srcCompat="@mipmap/ic_launcher"
        tools:visibility="visible" />
</ListView>

O problema está ai :(

<ListView
    android:id="@+id/activity_main_lista_de_alunos"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:contentDescription="TODO"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="#F44336"
        app:srcCompat="@mipmap/ic_launcher"
        tools:visibility="visible" />
</ListView>

O correto é:

<ListView
    android:id="@+id/activity_main_lista_de_alunos"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:contentDescription="TODO"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="#F44336"
        app:srcCompat="@mipmap/ic_launcher"
        tools:visibility="visible" />

Com o RelativeLayout englobando ambos

<RelativeLayout>
    <ListView />
    <FloatingActionButton />
</RelativeLayout>

Obrigado, agora o botão aparece e eu consigo selecioná-lo.

Mas toda vez que eu tento movê-lo ele vai para dentro de ListView, e o appAgenda não quer voltar a funcionar.

Como assim move-lo ?

A ideia é nós mexermos sempre xml, caso você queira mexer pelo editor grafico temos outros cursos que mostram como faze-lo funcionar, no momento eu focaria apenas em pegar os conceitos básicos do android e depois esses recursos + avançados.

O botão aparece no topo do Design, quando eu tento arrastá-lo para o final do Design, conforme é mostrado na aula. Dentro do Code o botão entra automaticamente para dentro do ListView.

Confirma se a configuração do seu Floating está assim:

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/activity_main_fab_novo_aluno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="16dp"
        android:clickable="true"
        android:focusable="true" />

Colocando esse código dentro do activity_main o botão vai para o rodapé do Design. Mas eu não posso tocar nele dentro do Design senão ele vai para dentro do ListView automaticamente. O código do activity_main está assim:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <ListView
        android:id="@+id/activity_main_lista_de_alunos"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/activity_main_fab_novo_aluno"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true"
            android:layout_margin="16dp"
            android:clickable="true"
            android:focusable="true" />


</RelativeLayout>

A ideia é só usar o xml por enquanto mesmo.

Mas dessa forma eu não consigo fazer a atividade descrita na aula. O instrutor sugere que façamos a movimentação do botão pela tela do Design.

Fazendo somente pelo xml não é a forma como está na aula. Eu gostaria de entender o porque está havendo essa diferença de comportamentos entro o meu projeto e a aula.

Notei que na aula o FAB está como:

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

mas no meu Android Studio só existe a opção:

<com.google.android.material.floatingactionbutton.FloatingActionButton/>

tentei colocar manualmente mas eu só recebo a mensagem de erro com o texto ficando em vermelho.

Você provavelmente está usando uma versão muito superior do que o instrutor usou no curso, por esse motivo está levando o erro.

O editor gráfico está projetado para trabalhar com ConstraintLayout que é a maneira mais indicada de fazer layout atualmente.

Sobre ele estar colocando dentro é justamente por conta disso, sua view está match_parent e então ele imagina que seja um container.

O que você pode tentar fazer é deixar o xml assim:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <ListView
        android:id="@+id/activity_main_lista_de_alunos"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/activity_main_fab_novo_aluno"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true"
            android:layout_margin="16dp"
            android:clickable="true"
            android:focusable="true" />


</RelativeLayout>

E tentar mexer pelo editor gráfico.

Sobre o caminho do Floating Action Button, também é algo novo, o pessoal do android refez todos os pacotes para deixa-los mais semânticos, mas os componentes são os mesmos.