我正在构建一个具有不同构建变体风格的应用程序.口味是"免费"和"付费".我想在我的java类上创建一些逻辑,只有在应用程序为"付费"时才会触发.因此,我需要一种方法来在gradle构建过程中设置"applicationId",如下所示:
gradle.build
productFlavors {
free {
applicationId "com.example.free"
resValue "string", "app_name", "Free App"
versionName "1.0-free"
}
paid {
applicationId "com.example.paid"
resValue "string", "app_name", "Paid App"
versionName "1.0-paid"
}
Run Code Online (Sandbox Code Playgroud)
一旦我有了应用程序ID,我就可以这样做:
if(whateverpackageid.equals("paid")) {
// Do something or trigger some premium functionality.
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地说,在gradle构建过程中,"applicationId"最终会在应用程序编译后成为"包名"?如果是这样,获得"应用程序ID"或"包名称"的最佳方法是什么,以便我可以在我的java文件中实现一些与味道相关的逻辑?
我已经查看了Stackoverflow上的所有问题,但无法找到这个问题的唯一确定答案.如何将标记设置为aFragment以便通过它检索getFragmentManager().findFragmentByTag()?有人可以给出一个如何创建标签的简单代码示例Fragment吗?
如何从app风格中删除活动?这是一个简化的例子,我有一个应用程序,它有以下两种口味(付费和免费).该应用程序很小,只有3个活动(MainActivity,ActivityOne和ActivityTwo).付费应用程序不需要任何限制,因为它将使用完整的代码库.然而,免费应用程序要求用户可以访问MainActivity和ActivityTwo,而不是ActivityOne.如何在编译代码时执行"Manifest Merge",以便免费版本中不存在ActivityOne?换句话说,应该如何创建src/free/AndroidManifest.xml以使免费应用程序没有ActivityOne?
下面是app 的build.gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.example.calculator"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
paid {
applicationId "com.example.paid"
resValue "string", "app_name", "Paid Calculator"
versionName "1.0-full"
}
free {
applicationId "com.example.free"
resValue "string", "app_name", "Free Calculator"
versionName "1.0-free"
}
}
sourceSets {
paid {
manifest.srcFile 'src/paid/AndroidManifest.xml'
}
free {
manifest.srcFile 'src/free/AndroidManifest.xml'
} …Run Code Online (Sandbox Code Playgroud) android android-activity android-gradle-plugin android-productflavors
我试图找到一个答案,但没有运气.我有一个片段,有一个名为'menu_roi_result_calc'的菜单项.每次屏幕旋转时,都会创建一个新菜单项.代码如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_roi_result_calc, menu);
return true;
}
Run Code Online (Sandbox Code Playgroud)
然而,在几次屏幕旋转后,这就是我得到的:

我感觉这是因为每次旋转都会重新创建菜单项,因此每次旋转时都会添加一个新项目.我如何让它停下来?如何检查项目是否存在并防止再次重新创建项目?任何代码示例将不胜感激.
我在适当的位置有Fragment“ A” ImageButton。单击此按钮后,将DialogFragment调用“ B”到前景,其中Fragment“ A”在背景中部分可见。DialogFragment“ B”为用户提供选择列表。单击特定选项后,DialogFragment“ B”将通过消失Dismiss(),Fragment“ A”再次变得完全可见。
在这个动作我需要更新ImageButton的Fragment“A”来表示用户的选择上进行DialogFragment“B”(基本上是一个新的形象的ImageButton)。
我认为在更新ImageButton片段“ A” 的正确位置期间正确OnResume吗?确实片段“A”进入OnPause,同时FragmentDialog正在显示“B”?因此,从DialogFragment“ B” 返回时,Fragment“ A”将触发它OnResume,这就是我应该对ImageButton呈现给用户的更新进行更改的地方?
希望我的解释清楚。任何关于我应该在哪里以及如何更新的详细帮助,ImageButton将不胜感激。
android android-lifecycle android-fragments android-dialogfragment
我已经注意到 Android Studio 在项目目录中有“mipmap”文件夹。据我了解,为了确保所有设备上的图像资源(应用内图标)保持一致,我们应该拥有 XML 格式的图像资源,如下所示:
<!-- drawable/numeric-1-box.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#757575"
android:pathData="M14,17H12V9H10V7H14M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3Z" />
</vector>
Run Code Online (Sandbox Code Playgroud)
我一直在使用Material Design Icons网站来获取 XML 格式的大部分常规图标。但是,我该如何创建这样的图标呢?到目前为止,我一直从上面显示的网站下载它们。有没有可以用来将图像导出为这些格式 (XML) 的工具?这样做的程序是什么?Photoshop、Illustrator 或其他图像转换网络工具?任何有关如何创建这些图像的帮助将不胜感激。
我知道如何使用公共变量实现简单的Parcelable类,但是下面的类要复杂一些。鉴于此类具有内部类和ListEntity,如何实现Parcelable接口?我什至不知道如何开始。任何有关如何执行此操作的详细信息将不胜感激。
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
public class ResponsePlaceSearch implements Parcelable {
// *** Parcelable methods are shown below (Begin) ***
protected ResponsePlaceSearch(Parcel in) {
}
public static final Creator<ResponsePlaceSearch> CREATOR = new Creator<ResponsePlaceSearch>() {
@Override
public ResponsePlaceSearch createFromParcel(Parcel in) {
return new ResponsePlaceSearch(in);
}
@Override
public ResponsePlaceSearch[] newArray(int size) {
return new ResponsePlaceSearch[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
// *** (End) ***
private List<ListEntity> …Run Code Online (Sandbox Code Playgroud)