2014-12-05 4 views
6

Ich habe 2 Geschmacksrichtungen - paidapp und freeapp. Der einzige Unterschied, dass payedapp 1 weitere Taste auf MainActivity hat, sagen "paidbutton". paidapp hat ein eigenes Layout mit Button android:id="@+id/paidbutton" und Layout für freeapp hat diesen Button nicht.Android Geschmack - kann keine Symbolvariable in R-Datei finden

In Code Ich benutze diese:

if (BuildConfig.FLAVOR.equals("paidapp")) { 
      View paidbutton = findViewById(R.id.paidbutton); 
      paidbutton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //... 
       } 
      }); 
} 

Aber ich habe einen Fehler cannot find symbol variable in findViewById(R.id.paidbutton);

Wie dieses Problem zu lösen, ohne in den beiden Geschmacksrichtungen MainActivity.java Klonen?

EDIT1 - fügen Sie mehr Code-Beispiele:

Gradle:

productFlavors { 
    paidapp { 
    } 
    freeapp { 
    } 
} 

/app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/goNext" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Go next" /> 

</LinearLayout> 

/app/src/bezahltapp/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/goNext" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Go next" /> 

    <Button 
     android:id="@+id/paidbutton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="See more" /> 


</LinearLayout> 

/app/src/main/java/company/com/myapplication/MainActivity.java

package company.com.myapplication; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Toast; 


public class MainActivity extends Activity { 

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

     View goNext = findViewById(R.id.goNext); 
     goNext.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(MainActivity.this, "goNext click", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     if (BuildConfig.FLAVOR.equals("paidapp")) { 
      View paidbutton = findViewById(R.id.paidbutton); 
      paidbutton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(MainActivity.this, "paidapp click", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    } 

} 

EDIT2 - Ich habe etwas Abhilfe mit Reflexion, fand aber nach wie vor für die normale Lösung suchen:

statt View paidbutton = findViewById(R.id.paidbutton); habe ich View paidbutton = findViewById(getIdFromRId("paidbutton"));

eingesetzt, wo getIdFromRId ist:

private int getIdFromRId(String idName) { 
    int id = 0; 
    try { 
     Class c = R.id.class; 
     Field field = c.getField(idName); 
     id = field.getInt(null); 
    } catch (Exception e) { 
     // do nothing 
    } 
    return id; 
} 
+0

Mit dem gleichen Fehler konfrontiert, aber dies scheint erwartetes Verhalten, denn wenn wir zu einer bestimmten 'Build-Variante (Flavor) wechseln', werden diese Flavor-spezifischen Ressourcen geladen, daher gibt die IDE Fehler kann Symbol nicht finden. Sie haben ** zwei Optionen ** 1. entweder Sie beide Schaltflächen in activity_main und verwenden Sie eine Layout-Datei von Main (keine Notwendigkeit für geschmackspezifische Version) und verstecken/zeigen Schaltflächen auf der Basis von Aromen zur Laufzeit. 2. Kopieren Sie Ihre 'MainActivity.java' in beide Varianten! –

Antwort

10

Wenn Sie kein paidbutton Layoutelement in der Produktartigkeit freeapp haben, können Sie einfach das entsprechende ID-Element in einer Ihrer Ressourcen-XML-Dateien in freeapp Produktaroma-Ordner deklarieren.Zum Beispiel erstellen Sie die Datei src/freeapp/res/values/ids.xml enthält:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <item name="paidbutton" type="id"/> 
</resources> 

Nachdem ich, dass Sie seit dem Symbol keine Probleme mit dem Kompilieren gemeinsamen Code haben werden R.id.paidbutton wird für beiden Produkte Aromen definiert werden. findViewById() Aufruf wird das echte Layoutelement in paidapp Build zurückgeben und Null in freeapp Build zurückgeben.

0

Können Sie bitte Ihren paidbutton XML-Tag und Ihre MainActivity.java-Klasse importieren.

Sie verwenden vielleicht die falsche Ressourcenimport wie import android.R; statt import my_package.R;

+0

Ich habe Import R nicht importiert – anber

+0

Wo ist Ihre Funktion im Code? Vor oder nach der Methode setContentView()? Compiler kann das R-Symbol nicht finden, weil Sie es vor seiner Initialisierung verwenden möchten. –

+0

welche Funktion? – anber

1

Sie benötigen, wenn Klausel in der erstellen und dann die setContentView hinzufügen, so somethin wie folgt aus:

if (BuildConfig.FLAVOR.equals("paidapp")) { 
     setContentView(R.layout.activity_main_paid); 
     View paidbutton = findViewById(R.id.paidbutton); 
     paidbutton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //... 
      } 
     }); 
} 
else{ 
    setContentView(R.layout.activity_main_free); 
} 

oder Sie könnte möglicherweise ein Layout für beide verwenden und nur die Schaltfläche unsichtbar machen

Ich hoffe, dies hilft

+0

Warum brauche ich activity_main_paid und activity_main_paid? Ich habe nur activity_main in beiden Geschmacksrichtungen – anber

+0

das sind nur die verschiedenen Layouts, verwenden Sie nur eine Mainactivity, und in dort entscheiden Sie, welches Layout Sie verwenden möchten – glm9637

+0

Sieht aus wie es funktioniert, aber es töten Aromen Idee mit verschiedenen sourceSets, sollte ich sich darum kümmern, welches xml manuell anstelle von androidPlugin chousen wird – anber

Verwandte Themen