使用抽屉然后处理 类 和链接文件资源时出错
Errors while using the drawer and then coping classes and linking file resources
我想为我的 Sony Smartwatch 3 创建一个 Android 应用程序,但对 Android Studio 以及如何处理不同的文件以使其正常工作几乎一无所知。
这就是我从 Android 开发人员指南开始的原因(一个困难且一点也不精确的指南 ("creating and running a wearable app"))。
正如您可能猜到的,我的这个 Android Wear 设备不支持当前的 API 所以我无法完全实现指南中描述的代码,不得不调整 APIs 和依赖关系,这对像我这样的非专业人士来说是一项艰巨的工作。我似乎已经开始工作了,我实际上可以在我的手表上显示带有自定义文本的应用程序。
目前情况:
然后是我想做的下一步,实现一个抽屉,这样我就可以在向上滑动时进入一个新菜单。因此,我看了 "Navigation and Actions with Wear 2.0",一个更适合初学者的教程,但基于他们提供的一个项目,该项目是针对圆形智能手表的,所以我不能轻易使用它,不得不坚持更详细的 support page 关于抽屉的 Android 开发人员。
问题 1:(我希望)我像那里说的那样实现了抽屉代码,现在我收到链接文件资源失败的编译器错误,但我不知道为什么。我在 Whosebug 上有类似答案的用户所指向的 acitvity_main.xml
中找不到任何线索。
问题 2: 另外,导航抽屉适配器存在这个问题,它链接到 class 我在开发者支持页面上实现了,然后导致MainActivity.java
.
中不可实例化的 class
我很抱歉要阅读这么多的文字,而错误的例子却这么少!
我认为查看这些文件会更清楚。我上传了项目 here 希望你能告诉我我能做些什么来让它工作。
我实际上不知道如何继续这个项目,我想我不能更容易地开始这个目标来创建一个 Wear 应用程序,希望任何人有勇气给我一个提示。
错误截图:
Logcat:
org.gradle.tooling.BuildException: Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-4.4-all.zip'.
at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:51)
at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:29)
at org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:41)
at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor.run(DefaultAsyncConsumerActionExecutor.java:57)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.StoppableExecutorImpl.run(StoppableExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:745)
...
Caused by: org.gradle.internal.exceptions.LocationAwareException: A
problem occurred configuring project ':app'. at
org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
...
Caused by: org.gradle.api.ProjectConfigurationException: A problem
occurred configuring project ':app'. at
org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94)
at
org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
...
Caused by: java.lang.IllegalStateException: Failed to find Build Tools
revision 27.0.3 at
com.android.builder.sdk.DefaultSdkLoader.getTargetInfo(DefaultSdkLoader.java:176)
at
com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:182)
at
com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.java:885)
at
com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:702)
at
com.android.build.gradle.BasePlugin.lambda$null(BasePlugin.java:652)
at
com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
提前致谢!
您的项目有几个错误!在 MainActivity.java 上,您有一个 onCreate() 方法的副本:
安装构建工具或改用版本 28
mWearableNavigationDrawer = findViewById(R.id.to_navigation_drawer)
;无法解决,因为您没有具有该 ID 的布局!相反,你有 top_drawer
(我猜)作为你的 WearableNavigationDrawer
的 ID
mWearableNavigationDrawer.setAdapter(YourImplementationnavigationAdapter);
也会报错,这里需要一个表达式,也就是你的适配器。类似于:mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this));
由于 YourImplementationNavigationAdapter 是抽象的,您需要像下面这样实现它的方法:
mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this){
@Override
public CharSequence getItemText(int i) {
return null;
}
@Override
public Drawable getItemDrawable(int i) {
return null;
}
@Override
public int getCount() {
return 0;
}
});
在 activity_main.xml
中,您应该注释 out/remove 这一行:app:actionMenu="@menu/action_drawer_menu
这引用了资源文件夹中不存在的菜单文件夹中的项目。或者你应该创建它。
activity_main_backup.xml
同上
更正这些,您的项目现在应该可以构建了。只需单击重建项目。
更新:
您的 MainActivity.java
应该如下所示:
public class MainActivity extends WearableActivity implements MenuItem.OnMenuItemClickListener {
private WearableDrawerLayout mWearableDrawerLayout;
private WearableNavigationDrawerView mWearableNavigationDrawer;
private WearableActionDrawerView mWearableActionDrawer;
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Top navigation drawer
mWearableNavigationDrawer = (WearableNavigationDrawerView) findViewById(R.id.top_drawer);
mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this) {
@Override
public CharSequence getItemText(int i) {
return null;
}
@Override
public Drawable getItemDrawable(int i) {
return null;
}
@Override
public int getCount() {
return 0;
}
});
// Peeks navigation drawer on the top.
mWearableNavigationDrawer.getController().peekDrawer();
// Bottom action drawer
mWearableActionDrawer = (WearableActionDrawerView) findViewById(R.id.bottom_action_drawer);
// Peeks action drawer on the bottom.
mWearableActionDrawer.getController().peekDrawer();
mWearableActionDrawer.setOnMenuItemClickListener(this);
}
}
我想为我的 Sony Smartwatch 3 创建一个 Android 应用程序,但对 Android Studio 以及如何处理不同的文件以使其正常工作几乎一无所知。
这就是我从 Android 开发人员指南开始的原因(一个困难且一点也不精确的指南 ("creating and running a wearable app"))。
正如您可能猜到的,我的这个 Android Wear 设备不支持当前的 API 所以我无法完全实现指南中描述的代码,不得不调整 APIs 和依赖关系,这对像我这样的非专业人士来说是一项艰巨的工作。我似乎已经开始工作了,我实际上可以在我的手表上显示带有自定义文本的应用程序。
目前情况: 然后是我想做的下一步,实现一个抽屉,这样我就可以在向上滑动时进入一个新菜单。因此,我看了 "Navigation and Actions with Wear 2.0",一个更适合初学者的教程,但基于他们提供的一个项目,该项目是针对圆形智能手表的,所以我不能轻易使用它,不得不坚持更详细的 support page 关于抽屉的 Android 开发人员。
问题 1:(我希望)我像那里说的那样实现了抽屉代码,现在我收到链接文件资源失败的编译器错误,但我不知道为什么。我在 Whosebug 上有类似答案的用户所指向的 acitvity_main.xml
中找不到任何线索。
问题 2: 另外,导航抽屉适配器存在这个问题,它链接到 class 我在开发者支持页面上实现了,然后导致MainActivity.java
.
我很抱歉要阅读这么多的文字,而错误的例子却这么少! 我认为查看这些文件会更清楚。我上传了项目 here 希望你能告诉我我能做些什么来让它工作。
我实际上不知道如何继续这个项目,我想我不能更容易地开始这个目标来创建一个 Wear 应用程序,希望任何人有勇气给我一个提示。
错误截图:
Logcat:
org.gradle.tooling.BuildException: Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-4.4-all.zip'. at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:51) at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:29) at org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:41) at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor.run(DefaultAsyncConsumerActionExecutor.java:57) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.StoppableExecutorImpl.run(StoppableExecutorImpl.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.lang.Thread.run(Thread.java:745) ...
Caused by: org.gradle.internal.exceptions.LocationAwareException: A problem occurred configuring project ':app'. at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
...
Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'. at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94) at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
...
Caused by: java.lang.IllegalStateException: Failed to find Build Tools revision 27.0.3 at com.android.builder.sdk.DefaultSdkLoader.getTargetInfo(DefaultSdkLoader.java:176) at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:182) at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.java:885) at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:702) at com.android.build.gradle.BasePlugin.lambda$null(BasePlugin.java:652) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
提前致谢!
您的项目有几个错误!在 MainActivity.java 上,您有一个 onCreate() 方法的副本:
安装构建工具或改用版本 28
mWearableNavigationDrawer = findViewById(R.id.to_navigation_drawer)
;无法解决,因为您没有具有该 ID 的布局!相反,你有top_drawer
(我猜)作为你的 WearableNavigationDrawer 的 ID
mWearableNavigationDrawer.setAdapter(YourImplementationnavigationAdapter);
也会报错,这里需要一个表达式,也就是你的适配器。类似于:mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this));
由于 YourImplementationNavigationAdapter 是抽象的,您需要像下面这样实现它的方法:
mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this){
@Override
public CharSequence getItemText(int i) {
return null;
}
@Override
public Drawable getItemDrawable(int i) {
return null;
}
@Override
public int getCount() {
return 0;
}
});
在
activity_main.xml
中,您应该注释 out/remove 这一行:app:actionMenu="@menu/action_drawer_menu
这引用了资源文件夹中不存在的菜单文件夹中的项目。或者你应该创建它。activity_main_backup.xml
同上
更正这些,您的项目现在应该可以构建了。只需单击重建项目。
更新:
您的 MainActivity.java
应该如下所示:
public class MainActivity extends WearableActivity implements MenuItem.OnMenuItemClickListener {
private WearableDrawerLayout mWearableDrawerLayout;
private WearableNavigationDrawerView mWearableNavigationDrawer;
private WearableActionDrawerView mWearableActionDrawer;
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Top navigation drawer
mWearableNavigationDrawer = (WearableNavigationDrawerView) findViewById(R.id.top_drawer);
mWearableNavigationDrawer.setAdapter(new YourImplementationNavigationAdapter(this) {
@Override
public CharSequence getItemText(int i) {
return null;
}
@Override
public Drawable getItemDrawable(int i) {
return null;
}
@Override
public int getCount() {
return 0;
}
});
// Peeks navigation drawer on the top.
mWearableNavigationDrawer.getController().peekDrawer();
// Bottom action drawer
mWearableActionDrawer = (WearableActionDrawerView) findViewById(R.id.bottom_action_drawer);
// Peeks action drawer on the bottom.
mWearableActionDrawer.getController().peekDrawer();
mWearableActionDrawer.setOnMenuItemClickListener(this);
}
}