簡體   English   中英

Android以編程方式為不同的屏幕尺寸/密度設置布局

[英]Android programmatically setting up layout for different screen sizes/densities

我當前正在創建一個我想要支持多種屏幕尺寸/密度的Android應用。 當我在xml中設置布局時,在不同的屏幕尺寸下一切看起來都很好。 但是,有些行需要以編程方式添加。

每當我添加行時,我似乎都無法在不同設備上看起來一致。 我相信,在xml中設置高度,寬度以及適當時使用wrap_content和match_parent時,使用dp單元可以使事情在不同設備之間輕松轉換。

以編程方式,當我嘗試設置布局高度/寬度時,我一直在嘗試將預期的dp值轉換為像素值。 我這樣做是這樣的:

    public static int convertToPixels(int value) {
        Resources resources = mContext.getResources();
        int x = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,value,resources.getDisplayMetrics());
        return x;
    }

總體來說,這些高度看起來不錯,但是寬度看起來並不好。 例如,行的寬度看起來將使得在較小的設備上,信息整齊地顯示在行中,這正是我想要的。 但是,例如,當我嘗試在平板電腦上運行該應用程序時,該信息僅會延伸到行的一半,這看起來並不好。 我希望尺寸可以縮放並整齊地顯示,就像在較小的設備上一樣。

如果有人知道我的問題可能是什么,我將不勝感激。 以下是使用Java添加行的來源:

        LinearLayout row = new LinearLayout(mContext);
        row.setOrientation(LinearLayout.HORIZONTAL);
        row.setId(Integer.parseInt(txn.getId().toString()));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, convertToPixels(60));
        params.setMargins(0, convertToPixels(1), 0, 0);

        row.setLayoutParams(params);
        row.setBackgroundColor(mContext.getResources().getColor(R.color.white));

        LinearLayout imageLayout = new LinearLayout(mContext);
        LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(convertToPixels(40), convertToPixels(40));
        imageParams.gravity = Gravity.CENTER;
        imageLayout.setLayoutParams(imageParams);
        ImageView image = new ImageView(mContext);


        if (txn.getTransactionStateID() == Constants.TXN_STATUS_OK) {
            image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ok));
        } else if (txn.getTransactionStateID() == Constants.TXN_STATUS_SUSPICIOUS) {
            image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.alert));
        } else if (txn.getTransactionStateID() == Constants.TXN_STATUS_RED_FLAG) {
            image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.flag));
        }

        imageLayout.addView(image);

        row.addView(imageLayout);

        LinearLayout txnMiddleLayout = new LinearLayout(mContext);
        txnMiddleLayout.setOrientation(LinearLayout.VERTICAL);
        LinearLayout.LayoutParams txnTopParams = new LinearLayout.LayoutParams(convertToPixels(400), convertToPixels(60));
        txnTopParams.setMargins(convertToPixels(10), 0, 0, 0);
        txnMiddleLayout.setLayoutParams(txnTopParams);

        TextView txnTopContents = new TextView(mContext);
        txnTopContents.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, convertToPixels(30)));
        txnTopContents.setText(txn.getTopLineContents());
        txnTopContents.setTextColor(Color.BLACK);
    //    txnTopContents.setTextSize(convertToPixels(16));
        TextView txnBottomContents = new TextView(mContext);
        txnBottomContents.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, convertToPixels(30)));
        txnBottomContents.setText(txn.getBottomLineContents());
    //    txnBottomContents.setTextSize(convertToPixels(12));

        txnMiddleLayout.addView(txnTopContents);
        txnMiddleLayout.addView(txnBottomContents);

        row.addView(txnMiddleLayout);


        LinearLayout txnBottomLayout = new LinearLayout(mContext);
        txnBottomLayout.setOrientation(LinearLayout.VERTICAL);
        LinearLayout.LayoutParams txnBottomParams = new LinearLayout.LayoutParams(convertToPixels(120), convertToPixels(60));
        txnBottomLayout.setLayoutParams(txnBottomParams);

        TextView amount = new TextView(mContext);
        amount.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, convertToPixels(30)));
        amount.setText(txn.getAmountStr());
        amount.setTextColor(Color.BLACK);
 //      amount.setTextSize(convertToPixels(16));

        TextView date = new TextView(mContext);
        date.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, convertToPixels(30)));
        date.setText(txn.getDateStr());
    //    date.setTextSize(convertToPixels(12));

        txnBottomLayout.addView(amount);
        txnBottomLayout.addView(date);

        row.addView(txnBottomLayout);

        txnList.addView(row);

我最終找到了解決方案。 我沒有嘗試設置確切的寬度值,而是將布局或textview的寬度設置為0,並使用layout_weight代替。

https://stackoverflow.com/a/3996104/4056947

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM