我是这里的新手(即使我已经阅读了很多主题),并且像一个月前一样,我开始使用Java和Android Studio进行开发。
我在这里发布内容是因为尽管我可以做所有的研究,但找不到任何解决方案。我的应用程序可以在API 28上正常运行,但不能在API 26上运行。
这是我的问题:我想创建第一个应用程序以获得更多应用程序的经验。我做了一个具有第一个活动的游戏,其中您必须单击播放以继续进行第二个活动,即带有一些imageButton的游戏,并且您必须单击一个带有计时器的得分,该计时器在您每次得分时都会减少。
我想和一群朋友分享这个游戏。他们都有配备android 8.0 minimun的android手机。因此,在启动新项目时,我已经选择了API26上的最低API级别。它可以完美地在具有API 26和API 28的虚拟设备上运行,但到目前为止,它仅在具有API28的真实手机上运行。
为解决此问题,我尝试将最低API级别降低到24。但是它也不起作用。
然后,经过一些阅读,我尝试更改 Project Structure => App => Properties 中的项目结构,并为Compile SDK版本设置了Android 8.0,并在 Flavors <中设置了Android 8.0。 / em> => 最小SDK版本和目标SDK版本
我遇到了这个错误
Android资源链接失败 app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values-v28 \ values-v28.xml:7:错误:未找到资源android:attr / dialogCornerRadius。
app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values-v28 \ values-v28.xml:11:错误:未找到资源android:attr / dialogCornerRadius。
app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values \ values.xml:2739:错误:未找到资源android:attr / fontVariationSettings。
app \ build \ intermediates \ incremental \ mergeDebugResources \ merged.dir \ values \ values.xml:2740:错误:未找到资源android:attr / ttcIndex。
错误:链接引用失败。
然后我更改了这一行:
实现'com.android.support:appcompat-v7:28.0.0'
作者
实现'com.android.support:appcompat-v7:26.0.0'
然后,它可以在具有API 26和API 28的虚拟设备上运行,但仍不能在具有API 26的真实设备上运行。 该应用程序从第一个活动开始,当人们单击播放时,它将关闭。
所以现在我不知道如何使它工作。
另一个有趣的事实是,当我生成与朋友共享的APK文件时,我会执行 Build =>生成签名包或APK ,然后选择 APK 我生成了APK文件。如果我与WhatsApp Web共享,则使用API 28的人只能将其下载为ZIP,如果我将其下载到手机上,然后与WhatsApp共享,则适用于他们。
感谢您的阅读。 我不是英语母语人士,所以如果您不了解或不需要某些内容,请问我,我很乐意为您提供解决此问题的任何方法:)
编辑:这是代码:
主要活动:
package com.example.taphypv123;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button jouer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.jouer=findViewById(R.id.jouer);
jouer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent Game = new Intent(getApplicationContext(), Game.class);
startActivity(Game);
finish();
}
});
}
}
然后进行Game
活动:
package com.example.taphypv123;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Intent;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Game extends AppCompatActivity {
private Game activity;
private Integer[] boquette={
R.drawable.imi1,
R.drawable.imi2,
R.drawable.imi3,
R.drawable.imi4,
R.drawable.imi5,
R.drawable.imi6,
R.drawable.imi7,
R.drawable.imi8,
R.drawable.imi9};
private Integer[] hyppieState ={
R.drawable.imia1,
R.drawable.imia2};
private List<Integer> melange = new ArrayList<>();
Integer tab[] = new Integer[melange.size()];
private TextView point;
private ImageButton imi1,imi2,imi3,imi4,imi5,imi6,imi7,imi8,imi9;
private int j=0;
ProgressBar mProgressBar;
CountDownTimer mCountDownTimer;
int time =5000;
private ObjectAnimator mAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game2);
// Définition du timer
mCountDownTimer=new CountDownTimer(time,100) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
startActivity(MainActivity);
Toast.makeText(getApplicationContext(),"Trop lent"+point.getText(),Toast.LENGTH_SHORT).show();
finish();
}
};
//Définition de la barre de progression
mProgressBar=findViewById(R.id.progressBar6);
mAnimation=ObjectAnimator.ofInt(mProgressBar,"progress",0,100);
mAnimation.setDuration(time);
mAnimation.setInterpolator(new DecelerateInterpolator());
mAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
@Override
public void onAnimationStart(Animator animator){
}
@Override
public void onAnimationEnd (Animator animator){
}
});
mAnimation.start();
mCountDownTimer.start();
this.activity=this;
this.imi1=findViewById(R.id.imi1);
this.imi2=findViewById(R.id.imi2);
this.imi3=findViewById(R.id.imi3);
this.imi4=findViewById(R.id.imi4);
this.imi5=findViewById(R.id.imi5);
this.imi6=findViewById(R.id.imi6);
this.imi7=findViewById(R.id.imi7);
this.imi8=findViewById(R.id.imi8);
this.imi9=findViewById(R.id.imi9);
this.point=findViewById(R.id.point);
for(int i = 0; i<9 ; i++) {
melange.add(i);}
Collections.shuffle(melange);
tab = melange.toArray(tab);
imi1.setImageDrawable(getDrawable(boquette[tab[0]]));
imi2.setImageDrawable(getDrawable(boquette[tab[1]]));
imi3.setImageDrawable(getDrawable(boquette[tab[2]]));
imi4.setImageDrawable(getDrawable(boquette[tab[3]]));
imi5.setImageDrawable(getDrawable(boquette[tab[4]]));
imi6.setImageDrawable(getDrawable(boquette[tab[5]]));
imi7.setImageDrawable(getDrawable(boquette[tab[6]]));
imi8.setImageDrawable(getDrawable(boquette[tab[7]]));
imi9.setImageDrawable(getDrawable(boquette[tab[8]]));
point.setText("Points = "+j);
imi1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final CustomPopUp Custompopup =new CustomPopUp(activity);
if (tab[0]==6) {
Custompopup.setTextPopUp("T'as gagné !");
Custompopup.setImPopUp(hyppieState[1]);
mAnimation.cancel();
mCountDownTimer.cancel();
Custompopup.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Collections.shuffle(melange);
tab = melange.toArray(tab);
imi1.setImageDrawable(getDrawable(boquette[tab[0]])); imi2.setImageDrawable(getDrawable(boquette[tab[1]])); imi3.setImageDrawable(getDrawable(boquette[tab[2]])); imi4.setImageDrawable(getDrawable(boquette[tab[3]])); imi5.setImageDrawable(getDrawable(boquette[tab[4]])); imi6.setImageDrawable(getDrawable(boquette[tab[5]])); imi7.setImageDrawable(getDrawable(boquette[tab[6]])); imi8.setImageDrawable(getDrawable(boquette[tab[7]])); imi9.setImageDrawable(getDrawable(boquette[tab[8]]));
j++;
point.setText("Points = "+j);
Toast.makeText(getApplicationContext(),"Bien joué",Toast.LENGTH_SHORT).show();
Custompopup.dismiss();
time=time-500;
mAnimation.setDuration(time);
mCountDownTimer=new CountDownTimer(time,10) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
startActivity(MainActivity);
Toast.makeText(getApplicationContext(),"Trop lent "+point.getText(),Toast.LENGTH_SHORT).show();
finish();
}
};
mAnimation.start();
mCountDownTimer.start();
}
});
Custompopup.build();
}
else {
Custompopup.setTextPopUp("T'es mauvais Jack !");
Custompopup.setImPopUp(hyppieState[0]);
mCountDownTimer.cancel();
Custompopup.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Perdu "+point.getText(),Toast.LENGTH_SHORT).show();
Custompopup.dismiss();
Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
startActivity(MainActivity);
finish();
}
});
Custompopup.build();
}
}
});
// Same code for imi2 to imi9
final CustomPopUp Cust = new CustomPopUp(activity);
if(j==123){
Cust.setTextPopUp("PHY'S !");
Cust.setImPopUp(hyppieState[0]);
Cust.getButtonPopUp().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent MainActivity=new Intent(getApplicationContext(), MainActivity.class);
startActivity(MainActivity);
finish();
}
});
Cust.build();
}
}
}
最后是CustomPopUp类:
package com.example.taphypv123;
import android.app.Activity;
import android.app.Dialog;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomPopUp extends Dialog {
private TextView TextPopUp;
private ImageView ImPopUp;
private Button ButtonPopUp;
private String message;
public CustomPopUp (Activity activity){
super(activity, R.style.Theme_AppCompat_DayNight_Dialog);
setContentView(R.layout.popup);
this.message="lolilol";
this.TextPopUp=findViewById(R.id.TextPopUp);
this.ImPopUp=findViewById(R.id.ImPopUp);
this.ButtonPopUp=findViewById(R.id.ButtonPopUp);
}
public void setTextPopUp (String message){
this.message=message;
}
public void setImPopUp (int imPop){
ImPopUp.setImageResource(imPop);
}
public Button getButtonPopUp() {return ButtonPopUp;}
public void build(){
show();
TextPopUp.setText(message);
}
}
MainActivity的布局是Constrain Layout
,游戏的布局是Linear Layout
,内部是GridView
,CustomPopUp布局是LinearLayout
如果需要的话,我可以告诉你。
我添加了档位:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.taphypv123"
minSdkVersion 26
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
事实是,它可以与虚拟设备Nexus 5 API 28和Nexus 5 API 26完美配合。因此,我没有得到任何错误或logcat(alt +6则什么也不说)。 但是,当我生成APK文件时,它可以在装有Android 9.0的Xperia XZ2上完美运行,并且在我的朋友的手机上也可以正常运行。但是,当我将APK文件交给具有三星A8和Android 8.0的朋友时,该应用程序可以正确打开,但是当他在MainActivity屏幕上单击“播放”时,该应用程序会关闭,而不会出现任何错误消息,它只是说“应用程序停止工作,请重新打开?”。 另一个是我制作了第一个应用程序,即当您单击图像时计数器会增加,并且在Samsung A8上运行良好。 这就是为什么我不明白为什么它不起作用的原因,但也许是因为我使用了API28中的某些类而不是API26?
再次感谢:)