0

我已经搜索并找到了大量的答案,但没有一个可以显示它们是如何插入到活动中的。

我的活动有一个 tabsadapter 和 viewpager (fragmentpageradapter)。就是这样。我已经将它设置为一个对话框,就像这样

    <style name="Theme.PopupTheme" parent="android:Theme.Holo.Light.Dialog">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">false</item>
    <item name="android:windowActionBar">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:padding">2sp</item>
    <item name="android:divider">@drawable/transparent</item>

现在,它工作得很好,只是它占据了显示器的整个尺寸,侧面和底部几乎没有任何透明度。这个活动没有布局,只有一个viewpager xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

因此,我与以编程方式调整应用程序大小有关。我发现我只能通过设置像素来​​管理它(以我的技能水平)。如果它适用于特定设备,它看起来不错,但与我的 S3 相比,我的 Nexus 10 上的应用程序看起来很糟糕,反之亦然,具体取决于我设置的像素数量。

如何使用 dip 以编程方式执行此操作?

4

4 回答 4

0

我认为没有办法直接将其设置为浸入。

您可以使用此方法从 dip 转换为 px 并使用结果来调整视图的大小。

private static float scale = 0;
...
public static int dps2pixels(int dps, Context context) {
    if (0 == scale) {
        scale = context.getResources().getDisplayMetrics().density;
    }
    return (int) (dps * scale + 0.5f);
}
于 2013-08-07T08:29:58.053 回答
0

有一个名为的现有实用程序方法TypedValue.applyDimensions(int, float, DisplayMetrics)可以执行此操作。

以下是如何使用它:

// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
(float) 123.4, getResources().getDisplayMetrics());

您可以使用其他类型的列表,包括COMPLEX_UNIT_SP, COMPLEX_UNIT_PT我在上面链接的页面中找到的所有类型。如果排除 (int) 类型转换,您将获得浮点数。

我遇到了同样的问题,并通过查看代码发现了这一点。

于 2013-08-07T08:30:32.667 回答
0

下面的代码是根据屏幕大小以编程方式添加进度条。也许你可以从这段代码中得到一些提示:

mProgressBar = (ProgressBar) findViewById(R.id.progress);

DisplayMetrics metrics = this.getResources().getDisplayMetrics();
int displayWidth = metrics.widthPixels;
int displayHeight = metrics.heightPixels;
int width = 0;
int topMargin = 0;
int leftRightMargin = 0;

float deviceWidth = (float)displayWidth/metrics.xdpi;
float perct = deviceWidth*76/100;
float finalWidth = perct*metrics.xdpi;

float deviceHeight = displayHeight/metrics.ydpi;

if(metrics.density == 1)
    perct = deviceHeight*16/100;
else if(metrics.density == 2)
    perct = deviceHeight*20/100;
else if(metrics.density == 1.5)
    perct = deviceHeight*18/100;

float finaltopMargin = perct*metrics.ydpi;

perct = deviceWidth*12/100;
float finalLeftMargin = perct*metrics.xdpi;

width = (int)finalWidth;
topMargin = (int)finaltopMargin;
leftRightMargin = (int)finalLeftMargin;

android.widget.RelativeLayout.LayoutParams params =  (android.widget.RelativeLayout.LayoutParams) new  android.widget.RelativeLayout.LayoutParams(width, width);

//params.setMargins(leftRightMargin, topMargin, 0, 0);
mProgressBar.setLayoutParams(params);
于 2013-08-07T08:31:00.910 回答
0

将像素转换为倾角,反之亦然,然后根据屏幕尺寸应用于您的计算。试试这个,它应该有帮助:

像素下降:

float scale = context.getResources().getDisplayMetrics().density;
int pixel = (int) (pixel * scale + 0.5f);

下降到像素:

int dip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
                getApplicationContext().getResources()
                        .getDisplayMetrics());
于 2013-08-07T08:31:58.083 回答