小编akh*_*707的帖子

我们如何保持画中画模式?

我们必须enterPictureInPictureMode()将活动从其当前形式转移到画中画表示.

除了破坏活动之外,我们还原的方法是什么,将活动恢复到正常状态?没有exitPictureInPictureMode(),leavePictureInPictureMode()janeGetMeOffThisCrazyPictureInPictureModeThing()方法Activity,文档似乎没有涵盖替代方案.

我对Android O的解决方案感兴趣,对于移动设备上的画中画模式,虽然如果它也适用于Android TV,太棒了!

更新2017-04-08:如果您想要的是当用户单击X按钮退出画中画模式时返回正常模式,您可以执行以下操作:

  @Override
  public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode);

    if (!isInPictureInPictureMode) {
      getApplication().startActivity(new Intent(this, getClass())
        .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
    }
  }
Run Code Online (Sandbox Code Playgroud)

关键位是调用startActivity()再次启动当前活动FLAG_ACTIVITY_REORDER_TO_FRONT.对于singleTask活动,您需要在某些非Activity上下文中调用它,例如Application单例.这似乎没有触发onStop()onStart(),但它确实触发onNewIntent()(无论Intent你传递给什么startActivity()).

android android-8.0-oreo android-picture-in-picture

35
推荐指数
3
解决办法
5010
查看次数

在TabLayout(Android设计支持库)中更改选项卡的背景颜色不会占用整个选项卡空间

我有一个TabLayout(设计支持库),它与包含三个选项卡的ViewPager绑定在一起.我设计了一个自定义布局,并将其设置为TabLayout中的每个选项卡.我一直在尝试更改当前所选选项卡的背景颜色.颜色仅包含在选项卡中的文本周围,但不占用整个选项卡空间.

以下是我的活动和自定义布局文件的代码段.

活动代码

public class CustomTabLayoutActivity extends AppCompatActivity {

private TabLayout tabLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_custom_tab_layout);
    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
    setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    setupTabLayout();
    viewPager.setCurrentItem(0);
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                if (i == position) {
                    tabLayout.getTabAt(i).getCustomView().setBackgroundColor(Color.parseColor("#198C19"));
                } else {
                    tabLayout.getTabAt(i).getCustomView().setBackgroundColor(Color.parseColor("#f4f4f4"));
                }
            }
        }

        @Override
        public void …
Run Code Online (Sandbox Code Playgroud)

android android-design-library android-tablayout

28
推荐指数
2
解决办法
4万
查看次数

android studio 更新后预览面板提供程序(JavaFX WebView)错误

将 Android Studio 更新到 4.1 后,出现错误:

尝试使用预览面板提供程序 (JavaXx WebView),但不可用。恢复默认。

有什么解决办法吗? 在此处输入图片说明

intellij-idea android-studio

21
推荐指数
1
解决办法
5441
查看次数

Resources $ NotFoundException:如果您尝试使用的资源是矢量资源,则可能以不支持的方式引用它

我收到以下错误消息

android.content.res.Resources$NotFoundException: If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
Run Code Online (Sandbox Code Playgroud)

当我试图设置以下内容时:

view.setBackgroundResource(R.drawable.highlight_background);
Run Code Online (Sandbox Code Playgroud)

要么

view.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.highlight_background));
Run Code Online (Sandbox Code Playgroud)

我也尝试使用AppCompatImage。这是在装有Android 4.4.4的设备上发生的。我发现了另一个StackOverflow线程,该线程可以添加

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
Run Code Online (Sandbox Code Playgroud)

进入MyApplication类,

    vectorDrawables.useSupportLibrary = true
Run Code Online (Sandbox Code Playgroud)

进入build.gradle。但是错误仍然发生。可绘制对象包括以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
   <stroke android:width="2dp" android:color="?attr/colorAccent" />
</shape>
Run Code Online (Sandbox Code Playgroud)

这只是包围图像的一条线。谁能帮我?

提前致谢!

android android-support-library androiddesignsupport android-support-design android-vectordrawable

10
推荐指数
1
解决办法
5165
查看次数

如何在Android中使用带有动态参考的FirebaseRecyclerAdapter?

我知道如何使用FirebaseRecyclerAdapterFirebase中的项目列表.我也知道如何使用索引从多个位置获取Firebase数据.但我不知道如何将其与FirebaseRecyclerAdapter结合使用.

我有一个简单的数据结构,用户可以成为朋友:

"users": {
  "user1": {
    "name": "name",
    "friends": {
      "user2": "true"
      }
    }
  "user2": {
    "name": "name",
    "friends": {
      "user1": "true"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我为用户名使用唯一ID.在这个简单的例子中,用户1和用户2是朋友.我想要做的是使用FirebaseRecyclerAdapter获取所有名称的列表(以及稍后可能更多).通常,我会通过获取"朋友"下的用户ID然后使用这些ID导航到他们的名字来获得列表.在Java中,它看起来像这样:

Firebase ref = new Firebase("<reference>");
ref.child("users/user1/friends").addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    String userId = snapshot.getKey();
    ref.child("users/" + userId + "/name").addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
        System.out.println(snapshot.getValue());
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) {
        // Do something here
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

但是在使用FirebaseRecyclerAdapter时,您只能定义一个URL.适配器将根据单个位置中的项目创建列表.

有没有办法调整适配器,以便从多个位置读取数据,就像上面的例子一样?或者有没有办法制作一个动态ref变量,它只指向同时存储在当前用户"朋友"列表中的用户ID?我正在考虑使用equals()方法,但我无法弄清楚究竟如何.

另一种方法是将用户名也存储在"朋友"列表中.但这不会改善数据结构.我每次都必须在两个地方更改名称(也许是后来的照片),这会引入更多的冗余.

有没有人有解决这个问题的方法?我无法在任何地方找到答案,但它似乎是一种常见的模式.除了让它工作之外,我该如何有效地做到这一点?

android firebase firebase-realtime-database

7
推荐指数
1
解决办法
1万
查看次数

android Oreo中的RTL布局错误

自从我在移动设备上升级到android oreo后,我的RTL支持应用程序无效.它正在将字符串更改为阿拉伯语,但不会更改布局方向.但如果我将同一个RTL转移到低于oreo的任何设备,一切正常.其他人遇到过这个问题?关于这个bug和解决方法还有任何官方声明吗?

下面是我更改区域设置的方法

public static boolean setDefaultLocale(Context context) {
    Resources resources = context.getResources();
    PreferenceManager preferenceManager = PreferenceManager.getInstance();
    String localLanguage = resources.getConfiguration().locale.getLanguage();
    boolean isLanguageChanged = !preferenceManager.getCurrentLanguageCode().equalsIgnoreCase(localLanguage);
    if (isLanguageChanged) {
        Log.d("", preferenceManager.getCurrentLanguageCode());
        Locale locale = new Locale(preferenceManager.getCurrentLanguageCode());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            Locale.setDefault(Locale.Category.DISPLAY, locale);
        else
            Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        ((Activity) context).recreate();
    }
    return isLanguageChanged;
}
Run Code Online (Sandbox Code Playgroud)

android android-layout android-8.0-oreo

6
推荐指数
2
解决办法
1637
查看次数

crunchPngs 在 Android buildTypes 中意味着什么?

作为Android Studio 3.0 Canary 5的变更日志,我们有一个新的 buildTypes 属性,名为crunchPngs,并且可以在 gradle 上使用它:

\n\n
android {\n    \xe2\x80\xa6\n    buildTypes {\n        release {\n            crunchPngs true\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它有什么作用?

\n

android gradle android-studio android-gradle-plugin

5
推荐指数
1
解决办法
2748
查看次数

我想为商店中的 android 和 ios 应用程序生成相同的 URL

我的应用程序商店和 Play 商店中有应用程序,android 和 ios 版本我想生成一个链接,如果它在 iPhone 中打开,则将用户重定向到应用程序商店,如果在 android 手机中打开,则重定向到 Play 商店这样做,有一些公司这样做。

android app-store ios google-play-services

5
推荐指数
2
解决办法
5780
查看次数

Android ffmpeg音频未完全合并视频文件

我想合并音频和视频文件.音频和视频文件的长度相同,但在输出视频文件音频完成合并过程后仅播放3-4秒,而音频和视频文件长度为14秒.请帮助我为什么音频不能完全在输出文件中播放.

String OutputPath = path + outputVideo;

        try {
            FrameGrabber grabber1 = new FFmpegFrameGrabber(videoFile);
            FrameGrabber grabber2 = new FFmpegFrameGrabber(audioFile);
            grabber1.start();

            grabber2.start();
            FrameRecorder recorder = new FFmpegFrameRecorder(OutputPath,
                    grabber1.getImageWidth(), grabber1.getImageHeight(),2);
            recorder.setFormat(grabber1.getFormat());
            recorder.setVideoQuality(1);
            recorder.setFrameRate(grabber1.getFrameRate());
            recorder.setSampleRate(grabber2.getSampleRate());
            recorder.start();
            Frame frame1, frame2;
            while ((frame1 = grabber1.grabFrame()) != null &&
                    (frame2 = grabber2.grabFrame()) != null) {
                recorder.record(frame1);
                recorder.record(frame2);
            }
            recorder.stop();
            grabber1.stop();
            grabber2.stop();

        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

android ffmpeg android-ffmpeg

5
推荐指数
0
解决办法
126
查看次数

为 Android 应用程序启用多语言支持

我正在开发一个android应用程序,它应该支持英语和阿拉伯语。我已经做了一个。创建了英语和阿拉伯语的值文件夹并更新了使用的字符串。b. 创建一个用于本地化的应用程序类 c.实现了Activity中点击按钮的代码

查看我的申请文件

我的应用程序.java

import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import java.util.Locale;
public class MyApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static void setLocaleAr (Context context){
        Locale locale = new Locale("ar");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getApplicationContext().getResources().updateConfiguration(config, null);
    }

    public static void setLocaleEn (Context context){
        Locale locale = new Locale("en_US");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getApplicationContext().getResources().updateConfiguration(config, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的活动类使用按钮单击

MainActivity.java

    import android.app.Activity;
    import android.content.Intent;
    import android.content.res.Configuration; …
Run Code Online (Sandbox Code Playgroud)

multilingual android localization

0
推荐指数
1
解决办法
1540
查看次数

我如何从null JSONObject获取数据?

这是我关于StackOverflow的第一个问题,很抱歉这个问题表达不好.

以下是logcat中的Json:

I/Result is: null{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80},"clouds":{"all":90},"dt":1485789600,"sys":{"type":1,"id":5091,"message":0.0103,"country":"GB","sunrise":1485762037,"sunset":1485794875},"id":2643743,"name":"London","cod":200}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

public class MainActivity extends AppCompatActivity {
    String weather,id,result;

    public class DownloadTask extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... urls) {
            try {
                URL url = new URL(urls[0]);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                int data = inputStreamReader.read();

                while(data != -1){
                    char count = (char) data;
                    result += count;
                    data = inputStreamReader.read();
                }

                return result;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) { …
Run Code Online (Sandbox Code Playgroud)

java android json exception-handling

0
推荐指数
1
解决办法
338
查看次数

我应该修复 Android Studio 显示的所有警告,还是直接抑制它们?

我刚刚完成了一个小型 Android 应用程序,其中有大量警告(“可能的 NPE”、“在 SimpleDateFormat 中使用 Locale”等)。显然,这些警告看起来不太漂亮。我知道有些人选择抑制警告,在某些情况下这是正确的方法,但是抑制所有警告是否有好处,或者我应该继续尝试尽可能多地纠正,例如添加 if -not-null 条件在每个可能的 NPE 之前,即使我相当确定该语句永远不会抛出 NPE,这意味着我只是添加另一个函数调用,与其他 if-not-null 条件聚合时可能会减慢速度在某种程度上关闭我的应用程序?

java android warnings

-1
推荐指数
1
解决办法
1538
查看次数

显示AlertDialog后未调用活动的onpause方法

我已经尝试过下面的代码来检查Activity的回调,据我所知,只要对话框出现在Activity顶部,就OnPause()应该调用Activity的方法。对话框消失时,OnResume()将触发“ 活动” 。

出乎意料的是,它并没有按预期的方式进行工作。我已经在Android M 6.0.1上进行了测试

如果我写错了,请纠正我,这是我的代码,

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onPause() {
        Log.d("MainActivity", "onPause");
        super.onPause();
    }

    @Override
    protected void onResume() {
        Log.d("MainActivity", "onResume");
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }


    public void onClick(View view) {
        AlertDialog.Builder builder;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            builder = new AlertDialog.Builder(MainActivity.this, android.R.style.Theme_Material_Dialog_Alert);
        } else {
            builder = …
Run Code Online (Sandbox Code Playgroud)

android android-alertdialog android-activity

-1
推荐指数
2
解决办法
1677
查看次数