我正在制作我的第一个应用程序。 这是一个简单的应用程序,带有启动画面和主要 Activity ,现在有了风格,我有两个构建变体:
免费版: Activity 底部带有 Admob 横幅
付费版:该应用程序不会在底部显示 admob 横幅,而是将其替换为用于切换 Activity 的底部导航 View (我将为此添加另一个 Activity ).
我告诉你,在我添加这个底部导航 View 之前,应用程序的所有部分都正常工作,包括构建变体。
这是我为添加底部导航菜单所做的:
首先,我将底部导航 View 放在 xml Activity 文件的底部:
valutausato.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_margin="8dp"
android:layout_centerHorizontal="true">
<TextView
android:id="@+id/TitoloText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="VALUTA IL TUO USATO"
android:textSize="32dp"
android:textAlignment="center"
android:textColor="@color/colorPrimaryDark"
android:fontFamily="sans-serif-condensed"
android:layout_weight="1"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="70dp"
android:layout_marginHorizontal="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Prezzo In Negozio:"
android:fontFamily="sans-serif"
android:textStyle="bold|italic"
android:textColor="#111"
android:textSize="22dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:layout_centerHorizontal="true">
<EditText
android:id="@+id/ProdottoNuovoTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:layout_weight="1"
android:inputType="numberDecimal"
android:digits="0123456789."
android:maxLength="30"
android:text="Inserisci qui il prezzo.."
android:textSize="22dp"
android:fontFamily="sans-serif-condensed"
android:textColor="@color/colorPrimary"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="160dp">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="In Garanzia"
android:layout_marginRight="0dp"
android:textSize="17dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="200dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Condizioni prodotto"
android:fontFamily="sans-serif"
android:textColor="#111"
android:textStyle="bold|italic"
android:textSize="22dp"/>
</LinearLayout>
<LinearLayout
android:layout_marginTop="250dp"
android:layout_centerHorizontal="true"
android:layout_marginHorizontal="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true">
<Spinner
android:id="@+id/ProdottoDanneggiatospn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginRight="0dp"
android:textColor="@color/colorPrimary"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="290dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Accessori"
android:layout_weight="1"
android:fontFamily="sans-serif"
android:textStyle="bold|italic"
android:textColor="#111"
android:textSize="22dp"/>
</LinearLayout>
<LinearLayout
android:layout_marginTop="340dp"
android:layout_centerHorizontal="true"
android:layout_marginHorizontal="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Spinner
android:id="@+id/PartiMancantispn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginRight="0dp"
android:textColor="@color/colorPrimary"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
android:layout_marginTop="400dp"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/BtnCalcola"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Calcola"
android:background="@color/ColorButton"
android:layout_weight="1"
android:fontFamily="sans-serif-smallcaps"
android:textStyle="bold|italic"
android:textSize="17dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="470dp"
android:layout_weight="1">
<TextView
android:id="@+id/FormPrezzoFinale"
android:textSize="22dp"
android:fontFamily="sans-serif-condensed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#002F80"
android:layout_weight="1"
android:text="prova"/>
</LinearLayout>
<android.support.design.internal.BottomNavigationView
android:id="@+id/MenuBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/background_menu_color"
app:itemTextColor="@drawable/background_menu_color"
app:menu="@menu/background_menu_main"/>
<com.google.android.gms.ads.AdView
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/SmartBanner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginTop="60dp"
ads:adSize="SMART_BANNER"
ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
</com.google.android.gms.ads.AdView>
</RelativeLayout>
在此之后,我使用正确的依赖项设置我的 app.build.gradle 文件
app.build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.viniusapp.value"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "version"
productFlavors {
freeVersion {
dimension "version"
applicationId "com.viniusapp.value.lite"
versionName = "1.0-lite"
}
paidVersion {
dimension "version"
applicationId "com.viniusapp.value.premium"
versionName = "1.0-premium"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
compile 'com.google.android.gms:play-services-ads:11.8.0'
compile 'com.android.support:design:26.1.0'
}
稍后我在 drawable 文件夹中创建底部导航 View 的文件
background_menu_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimaryDark" android:state_enabled="true"/>
<item android:color="@color/colorPrimary" android:state_enabled="true"/>
</selector>
最后,我在主 res 文件夹中创建“menu”文件夹,为菜单项创建 xml 文件,并为这两个操作创建两个图像资源。
background_menu_main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/Action_Value"
android:enabled="true"
android:icon="@drawable/ic_value"
android:title="Valuta"
app:showAsAction="ifRoom"
/>
<item
android:id="@+id/Action_Search"
android:enabled="true"
android:icon="@drawable/ic_search"
android:title="Cerca Sul Web"
app:showAsAction="ifRoom"
/>
</menu>
我做的最后一件事是在 java 文件中添加 BottomNavigation View (我删除了所有对这个问题无用的代码)
package com.vkapp.valutatoreusato;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.internal.BottomNavigationMenuView;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
import junit.runner.Version;
import java.lang.reflect.Type;
public class ValutaUsato extends Activity {
int Iva = 22;
double PriceProductNew;
double SalePriceOfProduct = 0;
boolean FirstLaunch = true;
int NumeroUtilizziTotali = 0;
Button BtnCalcola = null;
EditText PriceProductNewTxt = null;
TextView SalePriceText = null;
Spinner DamageProductState = null;
Spinner MissPartProductState = null;
InterstitialAd mInterstitialAd;
AdView SmartBanner;
BottomNavigationMenuView BottomNavigationMenuMoveForMove = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
BtnCalcola = (Button) findViewById(R.id.BtnCalcola);
BtnCalcola.setEnabled(false);
PriceProductNewTxt = (EditText) findViewById(R.id.ProdottoNuovoTxt);
SalePriceText = (TextView) findViewById(R.id.FormPrezzoFinale);
DamageProductState = (Spinner) findViewById(R.id.ProdottoDanneggiatospn);
MissPartProductState = (Spinner) findViewById(R.id.PartiMancantispn);
BottomNavigationMenuMoveForMove = (BottomNavigationMenuView) findViewById(R.id.MenuBottom);
BottomNavigationMenuMoveForMove.setEnabled(false);
super.onCreate(savedInstanceState);
setContentView(R.layout.valutausato);
if (BuildConfig.FLAVOR.equals("freeVersion")) {
Log.d("TAG", "Free Version running");
Log.d("TAG", BuildConfig.APPLICATION_ID);
Log.d("TAG", BuildConfig.VERSION_NAME);
MobileAds.initialize(this, "ca-app-pub-3526806334939799/1381568933");
SmartBanner = findViewById(R.id.SmartBanner);
AdRequest adRequest = new AdRequest.Builder().build();
SmartBanner.loadAd(adRequest);
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
;
}
if (BuildConfig.FLAVOR.equals("paidVersion")) {
Log.d("TAG", "Paid Version running");
BottomNavigationMenuMoveForMove.setEnabled(true);
Log.d("TAG", BuildConfig.APPLICATION_ID);
Log.d("TAG", BuildConfig.VERSION_NAME);
}
}
}
之后我的项目看起来像这样:
但是现在,当我调试/运行应用程序时,启动画面工作正常,但是当主要 Activity 启动时,应用程序崩溃并出现以下错误:
01-11 18:07:54.000 7279-7279/com.viniusapp.value.lite E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.viniusapp.value.lite, PID: 7279
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.viniusapp.value.lite/com.vkapp.valutatoreusato.ValutaUsato}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class android.support.design.internal.BottomNavigationView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class android.support.design.internal.BottomNavigationView
Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class android.support.design.internal.BottomNavigationView
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.internal.BottomNavigationView" on path: DexPathList[[zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/base.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_dependencies_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_0_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_1_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_2_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_3_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_4_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_5_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_6_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_7_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_8_apk.apk", zip file "/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.viniusapp.value.lite-yk6VQ4PuiYd-h1puOhz6iA==/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.view.LayoutInflater.createView(LayoutInflater.java:606)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:419)
at android.app.Activity.setContentView(Activity.java:2669)
at com.vkapp.valutatoreusato.ValutaUsato.onCreate(ValutaUsato.java:66)
at android.app.Activity.performCreate(Activity.java:6999)
at android.app.Activity.performCreate(Activity.java:6990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
我看到这个错误
at com.vkapp.valutatoreusato.ValutaUsato.onCreate(ValutaUsato.java:66)
将此声明链接给我
BottomNavigationMenuMoveForMove = (BottomNavigationMenuView) findViewById(R.id.MenuBottom);
我希望这对你来说是清楚的。
感谢您的帮助
最佳答案
您在 xml 代码中使用了错误的类。应该是:
<android.support.design.widget.BottomNavigationView
代替
<android.support.design.internal.BottomNavigationView
区别在于关键字:internal
和 widget
。
接下来在 Activity
中将 BottomNavigationMenuView
更改为 BottomNavigationView
。还要确保
super.onCreate(savedInstanceState);
setContentView(R.layout.valutausato)
代码在 onCreate
之上,而不是在连接 ID 之后。
关于android - 膨胀类 android.support.design.internal.BottomNavigationView 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214075/