我有一个带gradle的Android项目.问题是:在project视图中我看到了几个版本的support-v4库,例如support-v4-21.0.3和support-v4-22.2.0.
但在build.gradle我根本没有support-v4.
但我有~10个其他依赖项build.gradle.例如
appcompat-v7:22.2.0.我可以表明,appcompat-v7:22.2.0实际上还要考虑support-v4-22.2.0在Maven的依赖关系,并含蓄地将其拉.但我没有任何想法support-v4-21.0.3.
据我所知,所有这些库将包装在我的APK中并增加APK的重量.
所以我有下一个问题:
support-v4-21.0.3我的项目中哪个库需要?如何为Nexus 6准备资源?如果我将图像放到xxxhdpi,它们将缩小并降低质量.我把图像放到xxhdpi它们会扩大并失去质量.如果实际密度493ppi更接近xxhdpi~480dpi,为什么开发人员决定设置值为560dpi?
Nexus 6拥有令人印象深刻的5.96英寸四核高清屏幕,分辨率为2560 x 1440(493 ppi).这转换为~730 x 410 dp(密度无关像素).
Nexus 6的量化密度为560 dpi,介于xxhdpi和xxxhdpi主密度桶之间.
对于Nexus 6,该平台将缩减xxxhdpi资产,但如果这些资产不可用,那么它将扩大xxhdpi资产.
Run Code Online (Sandbox Code Playgroud)xxhdpi ~480dpi xxxhdpi ~640dpi
我在本教程中研究了如何使用ContentProviders和加载器
我是怎么看的:我们有一个Activity和ListView,SimpleCursorAdapter和CursorLoader.我们也实施ContentProvider.
在Activity我们可以调用getContentResolver().insert(URI, contentValues);通过点击一个按钮.
在我们的实现中ContentProvider,在insert()方法结束时,我们调用getContentResolver().notifyChange(URI, null);并且我们CursorLoader将收到消息,它应该重新加载数据并更新UI.此外,如果我们FLAG_REGISTER_CONTENT_OBSERVER在SimpleCursorAdapter其中使用它也将接收消息并且onContentChanged()将调用其方法.
因此,如果我们插入,更新或删除数据,我们的ListView将会更新.
Activity.startManagingCursor(cursor);已弃用,cursor.requery()已弃用,因此我没有看到任何练习意义 cursor.setNotificationUri().
我查看了setNotificationUri()方法的源代码,发现它调用mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)了方法.也是CursorLoader一样的.最后,游标将接收消息,并在Cursor内部调用以下方法:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法理解这一点.
所以我的问题是:我们为什么要叫cursor.setNotificationUri()在query()我们的方法ContentProvider实现?
database android cursor android-contentresolver android-contentprovider
更新至org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.0android构建失败后,出现以下问题:
More than one file was found with OS independent path 'META-INF/atomicfu.kotlin_module'
有什么解决方法可以使其正常工作?
我需要登录Facebook并获得相同的字段,如电子邮件等.我使用Facebook SDK,然后在developers.facebook中设置我的Android密钥Hash并设置"Configured for Android SSO".在模拟器和一些设备中,应用程序工作正常.
但是如果设备上安装了正式的Facebook应用程序,我的应用程序就无法运行:我按下登录按钮,但是我没有看到带有网络视图的对话框,我的密码和登录被要求.看起来Stack Overflow问题中的问题使用Android SDK的facebook.authorize不会调用onActivityResult或Stack Overflow问题Android Facebook API单点登录?,但我无法理解如何解决它.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
this.facebookConnector.getFacebook().authorizeCallback(requestCode, resultCode, data);
}
public void getAccessToken() {
SessionEvents.AuthListener listener = new SessionEvents.AuthListener() {
@Override
public void onAuthSucceed() {
setupAccessToken(facebookConnector.getFacebook().getAccessToken());
}
@Override
public void onAuthFail(String error) {
Toast.makeText(getApplicationContext(), getString(R.string.error_login), Toast.LENGTH_SHORT).show();
}
};
SessionEvents.addAuthListener(listener);
facebookConnector.login();
}
Run Code Online (Sandbox Code Playgroud)
public class FacebookConnector {
public void login() {
if (!facebook.isSessionValid()) {
facebook.authorize(this.activity, this.permissions, new LoginDialogListener());
}
}
private …Run Code Online (Sandbox Code Playgroud) 我有2种口味 - paidapp和freeapp.唯一不同的是,paidapp还有1个按钮MainActivity,比方说"paidbutton".paidapp有自己的布局,按钮android:id="@+id/paidbutton"和freeapp的布局没有这个按钮.
在代码我用这个:
if (BuildConfig.FLAVOR.equals("paidapp")) {
View paidbutton = findViewById(R.id.paidbutton);
paidbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//...
}
});
}
Run Code Online (Sandbox Code Playgroud)
但我有一个错误cannot find symbol variable的findViewById(R.id.paidbutton);
如何解决这个问题而不在两种风格中克隆MainActivity.java?
EDIT1 - 添加更多代码示例:
摇篮:
productFlavors {
paidapp {
}
freeapp {
}
}
Run Code Online (Sandbox Code Playgroud)
/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>
Run Code Online (Sandbox Code Playgroud)
/app/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 …Run Code Online (Sandbox Code Playgroud) 我写了Android应用程序,它的内存不足异常有一些奇怪的问题,它是随机出现的。是的,我知道OOM异常的问题通常是由于图像引起的,我尽力避免了此问题。我认为可以找到占用内存的地方的唯一方法是将包含有关内存信息的日志放到任何地方。但是我真的很困惑我需要哪些值。
我使用了下一个值:
在OOM异常之前,我有下一个值:
在这个问题上的Android位图限制-防止java.lang.OutOfMemory我看到用compeering((reqsize + Debug.getNativeHeapAllocatedSize()+ heapPad)> =调用Runtime.getRuntime()maxMemory()。)蚂蚁在这个博客的一些奇怪的信息:
Debug.getNativeHeapFreeSize(); 可用大小是由于碎片或资源分配而未使用的堆中的内存量。
另外我不明白如果(totalMemory:22407K)比(maxMemory:57344K)小得多,可能是OOM异常。
请帮助我了解如何使用此值。
我有 2 个版本的应用程序:付费应用程序和免费应用程序。我使用 gradle 和 Android Studio。我有下一个文件夹结构:
src文件夹,里面有 3 个文件夹:main, paidapp, freeapp- 其中paidapp 和 freeapp 是口味。我的配置:
defaultConfig {
applicationId "com.company"
}
buildTypes {
debug {
applicationIdSuffix '.dev'
}
}
productFlavors {
freeapp {
}
paidapp {
applicationId 'com.company.paidapp'
}
}
Run Code Online (Sandbox Code Playgroud)
我想要什么:我的手机上有 4 个应用程序:
package com.company.dev, name "dev freeapp"
package com.company.paidapp.dev, name "dev paidapp"
package com.company, name "freeapp"
package com.company.paidapp, name "paidapp"
Run Code Online (Sandbox Code Playgroud)
包没问题,gradle自动管理它,但是如何为应用程序创建不同的名称?
应用程序名称strings.xml
位于src/paidapp/res/values/strings.xml:
<string name="appName">dev paidapp</string>
Run Code Online (Sandbox Code Playgroud)
在src/freeapp/res/values/strings.xml:
<string …Run Code Online (Sandbox Code Playgroud) 我有我的应用程序的几个版本:普通版,说mainapp和几个建立每个客户的具体,比如说custom1,custom2,custom3.我希望所有customX口味都有基调.
我试图这样做:
创建项目结构:
app\src\main
app\src\mainapp
app\src\commonflavor
app\src\custom3
Run Code Online (Sandbox Code Playgroud)
并配置:
productFlavors {
mainapp {
}
custom1 {
}
custom2 {
}
custom3 {
}
}
sourceSets {
custom1 {
java.srcDirs = ['src/commonflavor/java']
}
custom2 {
java.srcDirs = ['src/commonflavor/java']
}
custom3 {
java.srcDirs = ['src/commonflavor/java', 'src/custom3/java']
}
}
Run Code Online (Sandbox Code Playgroud)
在commonflavor我为所有customX风格添加常见的java类时,请说MainActivity.java和SecondActivity.java.但是custom3我需要分开SecondActivity.java.
在这种情况下,我有一个错误error: duplicate class: SecondActivity来自src/commonflavor/java和src/custom3/java.
现在我已经使用class dupllication解决了这个问题:
sourceSets {
custom1 { …Run Code Online (Sandbox Code Playgroud)