小编NPi*_*ike的帖子

xlarge vs sw720dp屏幕尺寸混乱

供参考:http: //developer.android.com/guide/practices/screens_support.html

旧样式大小量词是"已弃用":

一组四种通用尺寸:小尺寸,普通尺寸,大尺寸和xlarge注意:从Android 3.2(API级别13)开始,不推荐使用这些尺寸组,而采用基于可用屏幕宽度管理屏幕尺寸的新技术.如果您正在为Android 3.2及更高版本开发,请参阅为Android 3.2声明平板电脑布局以获取更多信息.

我希望3.2+的设备仍然使用drawable-large-mdpi或layout-xlarge中声明的资源,但似乎并非如此.

我有一个测试项目,其中包含以下每种尺寸的布局文件:

  • 布局sw600dp
  • 布局720dp
  • 布局XLARGE
  • 布局

在运行Android 4.0.x的10"Motorola XOOM上,设备选择layout-720dp文件夹中的布局.如果该文件夹不存在,它会在layout-sw600dp文件夹中选择布局! 为什么不选择layout-xlarge中的布局?

更奇怪的是,我在这些文件夹中有drawable:

  • 提拉 - sw600dp-MDPI
  • 提拉 - XLARGE,MDPI

从上面的10"摩托罗拉XOOM,从drawable-sw600dp-mdpi中选择图像. 为什么不在drawable-xlarge-mdpi中选择drawable?

我们不应该期望xlarge量词在Android 3.2之上完全有效吗?

这是否意味着我必须将drawable-xlarge-mdpi文件夹中的所有资产复制到drawable-sw720dp-mdpi文件夹中?(支持Android 3.0,3.1和3.2+?)

希望我在这里错过了一些简单的东西.请指教.

android

8
推荐指数
1
解决办法
5830
查看次数

像YouTube一样切换全屏和方向

我想在视频播放器中点击"全屏"按钮时模仿YouTube Android应用的行为:

  • 如果设备当前处于纵向状态,请立即旋转至横向(即使用户仍在纵向按住设备)并保持横向状态,直到用户将设备旋转到横向然后再旋转回纵向
    • 如果设备当前处于横向状态,请立即旋转为纵向(即使用户仍在纵向按住设备)并保持纵向,直到用户将设备旋转为纵向,然后再旋转回横向.
    • 在任何时候,允许用户手动将其设备旋转到所需的方向.

似乎如果我使用以下方法强制旋转横向或纵向:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

要么

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)

...我立即失去了检测传感器方向变化的能力(即一旦用户处于风景中,他们想要手动将设备旋转回肖像).

如果我在onConfigurationChanged中将请求的方向更改为未指定的方向或传感器,则方向会暂时翻转为横向/纵向(无论我从上方请求),然后快速回到与设备保持方式相匹配的方向.

关于如何实现上述目标的任何想法?

android

8
推荐指数
2
解决办法
2320
查看次数

单个活动中的多个AsyncTaskLoader - 是否必须在onCreate中初始化每个加载器?

我有一个带有ViewPager的FragmentActivity - 这个ViewPager包含三个ListView - 每个ListView都有自己独特的适配器(和唯一的数据集).

我想使用AsyncTaskLoader来填充这些适配器,但仅限于在ViewPager中选择给定视图时.

是否需要在activity的onCreate方法中初始化一个加载器?(下面的代码)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foo);

    getSupportLoaderManager().initLoader(0, null, this);
    getSupportLoaderManager().initLoader(1, null, this);
    getSupportLoaderManager().initLoader(2, null, this);
}
Run Code Online (Sandbox Code Playgroud)

或者可以交互式地调用initLoader(...),例如OnPageChangeListener.onPageSelected的监听器的结果?

mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int newPage) {
        getSupportLoaderManager().initLoader(newPage, null, this);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果用户可能只查看寻呼机中的第一个视图,我想避免必须预先执行3个耗时的加载器.

编辑: 或者让ViewPager为每个视图使用Fragment是一个更好的设计,每个片段都负责管理自己的加载器?

android android-viewpager

6
推荐指数
1
解决办法
2295
查看次数

MediaPlayer:在状态4中停止调用

我的活动有一个异步准备视频的VideoView:

Uri mUri = "uri to streaming video"
VideoView mVideoView = (VideoView) rootView.findViewById(R.id.videoView);
mVideoView.setOnErrorListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setVideoURI(mUri);
mVideoView.setMediaController(null);

mVideoView.setOnPreparedListener(this);
Run Code Online (Sandbox Code Playgroud)

当它正在"准备"时,我会显示一个ProgressDialog ...如果我在此状态下按下后退按钮,则会向ADB打印以下错误,并且活动会在黑屏上等待一小段时间静默崩溃:

E/MediaPlayer( 2204): stop called in state 4
E/MediaPlayer( 2204): error (-38, 0) 
W/ActivityManager(   59): Activity pause timeout for HistoryRecord{45080368 com.myapp.VideoPlayerActivity}
Run Code Online (Sandbox Code Playgroud)

阻止VideoView准备视频以便退出活动的最佳方法是什么?

注意:在调用正在准备的视频的回调之前,我无权访问实际的MediaPlayer对象:

@Override
public void onPrepared(MediaPlayer player)
Run Code Online (Sandbox Code Playgroud)

...当MediaPlayer/VideoView正在"准备"时没有发生.

android android-mediaplayer

6
推荐指数
1
解决办法
7936
查看次数

drawable-xlarge-mdpi和drawable-sw600dp-mdpi的资源没有重复

我想为drawable-xlarge-mdpi和drawable-sw600dp-mdpi提供相同的图像资源/ drawable.

似乎我能做到这一点的唯一方法是在res /下创建两个文件夹,并将同一组资源复制到每个文件夹中.

使用布局,我们可以进行别名.即在values文件夹中使用特定限定符创建名为layout.xml的文件,并添加项以指向两个限定符的单个布局文件:

  • 价值观XLARGE\values.xml
  • 价值观sw600dp\values.xml

这两个文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="activity_shows" type="layout">@layout/activity_shows_tablet</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

(匹配xlarge的设备或匹配sw600dp的设备现在将使用activity_shows_tablet.xml作为"activity_shows"的布局文件)

drawables有类似的方法吗?

android

6
推荐指数
1
解决办法
5017
查看次数

VideoView不会缩放内容以匹配其父级

我正在使用DraggablePanel库(https://github.com/pedrovgs/DraggablePanel)来促进类似YouTube的视频播放器.如果您不熟悉此功能,它基本上允许用户将当前正在播放的视频缩小为停靠在屏幕一角的小缩略图.

不幸的是(我不太确定这是上述库的问题)我注意到如果我在VideoView的父视图上应用X和Y比例,VideoView本身将不会调整其内容的大小以匹配.

请参见下面的屏幕截图,其中VideoView处于自然规模,然后将其父视图缩小到约0.6:0.6.您应该注意到,在缩放的屏幕截图中,VideoView已裁剪其内容而不是调整大小以适应.

VideoView正确缩放1:1

VideoView父级缩放到0.6:0.6

所以当我的父级比例发生变化时,我试图在VideoView上强制宽度和高度.互联网上有一些关于覆盖VideoView尺寸的例子 - 但这是我的简单版本:

public class ScalableVideoView extends VideoView {

    private int mVideoWidth;
    private int mVideoHeight;

    public ScalableVideoView(Context context) {
        super(context);
    }

    public ScalableVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScalableVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mVideoWidth = 0;
        mVideoHeight = 0;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (mVideoWidth > 0 && mVideoHeight > 0) {
            // If a custom dimension is specified, force it as …
Run Code Online (Sandbox Code Playgroud)

android

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

DateUtils.getRelativeTimeSpanString用于将来的日期

因此,Android SDK中的[DateUtils.getRelativeTimeSpanString()] [1]非常适合显示过去的相对时间.

即:5天前,或5分钟前.

但对于将来的日期似乎并不那么好.它似乎只是打印日期.

是否有任何简单的替代方法可以为将来的日期生成相对时间跨度字符串(没有通过比较两个日历对象来写出能够计算天,小时,分钟,秒的内容)?

长达5天或5分钟的路线?

这基本上是我必须做的,它看起来有点脏(注意:这段代码只是为帖子编写而不是实际上通过java编译器运行):

Calendar calendarIO = Calendar.getInstance();
calendarIO.set(2013, 2, 14, 7, 0);

long milliseconds1 = calendarIO.getTimeInMillis();
long milliseconds2 = System.currentTimeMillis();
long diff = milliseconds1 - milliseconds2;
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
long diffDays = diff / (24 * 60 * 60 * 1000);   

String relativeTime = "";
if (diffDays > 1) {
    relativeTime = diffDays + …
Run Code Online (Sandbox Code Playgroud)

android

3
推荐指数
1
解决办法
7486
查看次数

正在进行的通知

我正在尝试创建一个通知,该通知将显示在通知栏的"正在进行"区域(如WeatherBug).

这是我正在使用的代码:

PendingIntent intent = PendingIntent.getActivity(lastContext, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,FLAG_NO_CLEAR也应该通过按下清除按钮来防止通知被清除,这也是行不通的

任何提示SO?

android

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

Visual Studio 2005中的<regex>在哪里?

我正在将一个VS2010项目移植到VS2005(不要问为什么......).在VS2010中,以下工作正常:

#include <regex>
Run Code Online (Sandbox Code Playgroud)

但在VS2005中它是一个致命的错误:

fatal error C1083: Cannot open include file: 'regex': No such file or directory
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:我应该补充一点,我是一个C++/VS新手.如果不是VS2005的一部分,我也欢迎有关使用什么作为正则表达式库的建议.

谢谢!

c++ visual-studio-2005

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

用新的set对象替换set对象

我有一个私人领域的班级:

std::set<std::string> _channelNames;
Run Code Online (Sandbox Code Playgroud)

..和一个可选的setter函数:

void setChannelNames(std::set channelNames);
Run Code Online (Sandbox Code Playgroud)

在setter函数中,如何将private _channelNames字段替换为setter函数传递的字段?

我试过了:

void Parser::setChannelNames(std::set channelNames) {
    this->_channelNames = channelNames;
}
Run Code Online (Sandbox Code Playgroud)

但这在VS2005中产生了一个错误:

Error   2   error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::set' (or there is no acceptable conversion)   parser.cpp 61
Run Code Online (Sandbox Code Playgroud)

我绝对是一个C++新手,并期望我应该在这里做一些指针工作.

任何快速提示?

谢谢!

c++

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

检测onTouch中的MouseEvent是否位于绘制到自定义视图画布的圆圈内.

我试图从一个Android应用程序开始,在此之前我需要做以下事情:我有一个从View类扩展的类和实现View.onTouchListener接口.现在,我在onDraw()方法中绘制了一个圆圈,以便圆圈出现在应用程序的开头.现在,当用户触摸(实际点击)圆圈时,我想做点什么.所以,我在这里要做的第一件事就是在圆圈的触摸上显示一个toast msg.我尝试使用以下代码但没有任何反应.请帮我找到解决方案.

这是View类:

    package com.exam.trial;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class pad extends View implements View.OnTouchListener{

Paint paint;
public pad(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    paint = new Paint();
}


public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
    case MotionEvent.ACTION_DOWN: {
        if (event.getX()>70 && event.getX()<130 && event.getY()>70 && event.getY()<130)
        {
            Toast toast = Toast.makeText(getContext(), "Works fine", Toast.LENGTH_SHORT);
            toast.show();
        }
        return true;
    }

}
return false;
}


@Override …
Run Code Online (Sandbox Code Playgroud)

android ontouchlistener

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

活动对话框主题

我正在创建一个Android小部件.我的小部件有一个视图,当点击时打开一个Activity看起来像Dialog.

我已更新AndroidManifest.xml为此活动设置样式,如对话框.

<activity 
    android:name=".Widget.Widget_OeffneDialog" 
    android:theme="@android:style/Theme.Dialog">
</activity>
Run Code Online (Sandbox Code Playgroud)

这太棒了.

现在我从这个Widget打开应用程序并单击主页按钮(应用程序现在在后台),然后单击对话框显示的wdget - 但应用程序的其余部分显示在对话框后面.

像这儿: 在此输入图像描述

我不想在对话框活动下面看到之前的活动 - 我该怎么做?

android dialog android-activity

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