2014-12-05 90 views
6

我有2种风格 - paidapp和freeapp。 付款应用程序在MainActivity上有另外1个按钮,比如"paidbutton"。 paidapp有自己的按钮android:id="@+id/paidbutton"布局和freeapp的布局没有这个按钮。Android风味 - 在R文件中找不到符号变量

在代码中我使用这个:

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

但我cannot find symbol variablefindViewById(R.id.paidbutton);

错误如何在没有在这两种口味克隆MainActivity.java解决这个问题?

EDIT1 - 添加更多的代码实例:

摇篮:

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> 

/应用/ src/paidapp/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 - 我已经找到了一些解决方法使用反射,但仍然在寻找正解:

代替View paidbutton = findViewById(R.id.paidbutton);我用View paidbutton = findViewById(getIdFromRId("paidbutton"));

其中getIdFromRId是:

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

面对相同的错误,但这似乎是预期的行为,因为当我们切换到特定的'构建变体(flavor)'时,该特定的资源被加载,因此IDE给出错误找不到符号。你有**两个选项** 1.或者你把两个按钮都放在activity_main中,并且使用main中的一个布局文件(不需要特定于风味的版本)并且在运行时基于风味隐藏/显示按钮。 2.将你的'MainActivity.java'复制到两种口味中! – 2016-03-11 10:23:37

回答

10

如果您在freeapp产品风格中根本没有paidbutton布局元素,则可以在freeapp产品风味文件夹中的一个资源xml文件中声明相应的id项。例如创建文件src/freeapp/res/values/ids.xml包含:

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

这样做,你必须与共同编制的代码,因为符号R.id.paidbutton两个口味的产品将被定义没有问题后。 findViewById()调用将返回paidapp构建中的实际布局元素,并将在freeapp构建中返回null。

0

你可以把你的paidbutton XML标签和你的MainActivity.java类导入请。

您可能使用类似的import android.R;代替import my_package.R;

+0

我没有进口R在进口 – anber 2014-12-05 10:10:01

+0

你的代码在哪里? setContentView()方法之前还是之后? Compilator无法找到R符号,因为您在初始化之前尝试使用它。 – 2014-12-05 14:26:39

+0

哪些功能? – anber 2014-12-05 14:29:03

1

你需要错误的资源导入您如果子句上创建,然后添加的setContentView,所以事端像这样:

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); 
} 

,或者你可能会使用一个布局的两个,只是使按钮隐形

我希望这可以帮助

+0

为什么我需要activity_main_paid和activity_main_paid?我只是在这两种口味 – anber 2014-12-05 10:08:40

+0

这些只是不同的布局,你只使用一个主要活动,并在那里你决定要使用的布局 – glm9637 2014-12-05 11:08:35

+0

看起来像它会工作,但它杀死与不同的sourceSets味道的想法,我应该关心哪些xml手动而不是androidPlugin – anber 2014-12-05 11:15:21