2014-12-05 22 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