Erro Android xml: “Nenhum recurso encontrado que corresponda ao nome fornecido” com RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)

92

Ok, então isso está começando a realmente me irritar. Este erro surge de uma forma muito especial, não muito lógica.

Deixe-me começar dizendo que eu já olhei para as outras questões relacionadas a este erro, o Google também. Pelo que eu posso dizer, a maioria dos problemas semelhantes ocorrem porque as pessoas se referem a um Stringrecurso ou algo diferente no mesmo arquivo de layout, elas colocam '+' em '@ id +' ou algo semelhante.

O problema que estou tendo ocorre em um arquivo de layout .xml com um RelativeLayout. Este contém umTableLayout , dois LinearLayouts contendo algum texto e, finalmente, um ProgressBar. O que eu quero é que a barra de progresso seja alinhada com o layout relativo usando android:layout_alignParentBottom="true"e, em seguida, alinhe os dois layouts lineares acima da barra de progresso (o layout linear inferior alinhado acima da barra de progresso, o outro alinhado acima do layout linear inferior).

Deve ser bastante simples e parecer que funciona, ou seja, a visualização gráfica mostra o resultado desejado. No entanto, e aí vem o problema , o Eclipse me dá um erro nos dois layouts lineares,

"Erro: nenhum recurso encontrado que corresponda ao nome fornecido (em 'layout_above' com o valor '@ id / LinearLayout_acc')."

e o mesmo erro para o outro layout linear referente à barra de progresso. Verifiquei mais do que três vezes se não há erros de digitação (os ids também existem em packagename.R.java) e tentei limpar o projeto uma dúzia de vezes.

Não recebo o erro ao salvar (e construir automaticamente), não até decidir executar o projeto. Outra coisa estranha é que quando me refiro ao layout linear inferior da barra de progresso em vez do layout linear superior, não recebo nenhum erro!

Meu arquivo de layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_activity" >
        <TableLayout
             ... />

        <LinearLayout
            android:id="@+id/LinearLayout_dist"
            android:layout_above="@id/LinearLayout_acc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp" >

            <TextView
                ... />

            <TextView
                ... />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/LinearLayout_acc"
            android:layout_above="@id/ProgressBar_statusScreen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true" >

            <TextView
                ... />

            <TextView
                ... />
        </LinearLayout>

        <ProgressBar
            android:id="@+id/ProgressBar_statusScreen"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="16dp" />

</RelativeLayout>

Por favor me ajude, não tenho ideia do que causa este erro!

Editar com respostas

Shrikant veio com a solução de alterar a ordem de aparência no arquivo de layout para que os elementos referenciem apenas outros elementos já definidos quando a referência for lida.
Além disso, como outros postaram, mudar @id/para @+id/, mesmo em uma referência, remove as mensagens de erro. Como Marco W. escreveu neste tópico, o que acontece é que você deve usar @+id/a primeira vez que cada id é mencionado e depois usar @id/, mesmo que a primeira vez não seja uma definição.

Fiz a maior parte do design e configurei os ids referidos no editor gráfico do Eclipse, de forma que o código que resultou em uma mensagem de erro foi inserido automaticamente. Talvez este seja um bug no Eclipse.

Stemadsen
fonte

Respostas:

77

Por favor, verifique o código abaixo

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ic_launcher" >

<TableLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<LinearLayout
    android:id="@+id/LinearLayout_dist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/LinearLayout_acc"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="10dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FIRST" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SECOND" />
   </LinearLayout>

   <LinearLayout
    android:id="@+id/LinearLayout_acc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/ProgressBar_statusScreen"
    android:layout_centerHorizontal="true" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="THIRD" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FOURTH" />
   </LinearLayout>

   <ProgressBar
    android:id="@+id/ProgressBar_statusScreen"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_margin="16dp" />

 </RelativeLayout>

Verifique também o seguinte link . Diz que android: layout_below = "@ id / myTextView" não reconhecerá um elemento com id "myTextView" se for escrito após o elemento em que você está usando.

Shrikant
fonte
8
Obrigado por este comentário: android: layout_below = "@ id / myTextView" não reconhecerá um elemento com id "myTextView" se for escrito após o elemento em que você está usando . Isso resolveu o problema, embora eu ache ridículo que você tenha que escrever os elementos na ordem "correta" ... Possivelmente um bug.
stemadsen
4
Com certeza isso é um bug. Os IDs de layout devem ser independentes da ordem de definição. Especialmente irritante que o designer de layout na tela no Android Studio não tenha problemas com isso.
dodgy_coder
@stemadsen não é um bug. parser simplesmente cria a visão e sua referência (Id) primeira vez que encontra o elemento da visão. você está se referindo a um elemento não visitado. considere um cenário em que A se define abaixo de B e, posteriormente, B se define abaixo de A. a limitação da ordenação resolve o problema lógico
Masoud Dadashi
Deixe-me observar aqui: não é possível fazer referências no elemento de interface do usuário no qual você está trabalhando para elementos de interface de usuário escritos DEPOIS (não antes).
ivanleoncz
85

mudança

@id/LinearLayout_acc

para

@+id/LinearLayout_acc
jeet
fonte
3
Uau, isso realmente funciona. Achei que @id/fosse para fazer referência a ids existentes, @+id/para criar novos ids e que eles não poderiam ser trocados. Por que essa abordagem é legal? Eu defino o id duas vezes então?
stemadsen
na verdade, é um valor longo para id, @ + id / refere-se a algum valor longo. e se atribuímos algum valor de id a algum componente, podemos usar apenas esse id para fazer referência às visualizações.
jeet
Isso parece estranho, porque em todos os outros layouts faço referência a outros ids com @ id / e não @ + id /. Além disso, como Shrikant observou abaixo, se eu mudar a ordem dos elementos referenciados, ele funcionará com @ id /.
stemadsen
1
Uma maneira muito legal de manter os elementos em um Layout relativo na ordem em que aparecerão na tela, exatamente o que eu estava procurando.
GLee
2
SIM SENHOR! Dê uma medalha àquele homem. Isso é exatamente o que você deve fazer, se for necessário fazer referência a uma Visualização que é criada posteriormente no layout.
Yoraco Gonzales
15

Altere cada id @idpara @+id, não importa quando está definindo ou referenciando um id. Com isso, você não vai conseguir

Erro xml do Android: “Nenhum recurso encontrado que corresponda ao nome fornecido” com RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen).

AkashG
fonte
2
 <LinearLayout
        android:id="@+id/LinearLayout_dist"
        android:layout_above="@+id/LinearLayout_acc" <--- here might be a problem you forgot + sign
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp" >
Hardik Nadiyapara
fonte