我们必须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()).
我有一个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.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
我知道如何使用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 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 Studio 3.0 Canary 5的变更日志,我们有一个新的 buildTypes 属性,名为crunchPngs,并且可以在 gradle 上使用它:
android {\n \xe2\x80\xa6\n buildTypes {\n release {\n crunchPngs true\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n它有什么作用?
\n我的应用程序商店和 Play 商店中有应用程序,android 和 ios 版本我想生成一个链接,如果它在 iPhone 中打开,则将用户重定向到应用程序商店,如果在 android 手机中打开,则重定向到 Play 商店这样做,有一些公司这样做。
我想合并音频和视频文件.音频和视频文件的长度相同,但在输出视频文件音频完成合并过程后仅播放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应用程序,它应该支持英语和阿拉伯语。我已经做了一个。创建了英语和阿拉伯语的值文件夹并更新了使用的字符串。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) 这是我关于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) 我刚刚完成了一个小型 Android 应用程序,其中有大量警告(“可能的 NPE”、“在 SimpleDateFormat 中使用 Locale”等)。显然,这些警告看起来不太漂亮。我知道有些人选择抑制警告,在某些情况下这是正确的方法,但是抑制所有警告是否有好处,或者我应该继续尝试尽可能多地纠正,例如添加 if -not-null 条件在每个可能的 NPE 之前,即使我相当确定该语句永远不会抛出 NPE,这意味着我只是添加另一个函数调用,与其他 if-not-null 条件聚合时可能会减慢速度在某种程度上关闭我的应用程序?
我已经尝试过下面的代码来检查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)