3

ライナー レイアウトのサブクラスがあります (XML カスタム タイプから参照されます)。設定しようとした最小の高さが機能せず、レイアウトも設定されていません。これをプログラムで行う必要があります...

setMinimumHeight() が機能しないのはなぜですか?

注: コードの複雑さは無視できます。設定されている値は 70 です。

public class SummaryDynamicSpacer extends LinearLayout {

    private static final String TAG = "mymeter-DynamicSpacer";
    int dpWidth = 0;
    int dpHeight = 0;

    public SummaryDynamicSpacer(Context context) {
        super(context);
        init(context);
    }

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

    private void init(Context context) {
        DisplayMetrics metrics = new DisplayMetrics();
        ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(metrics);

        //Set dpWidth, this is the key metric we use for scaling.
        float density  = getResources().getDisplayMetrics().density;
        float dpWidth  = metrics.widthPixels / density;
        float dpHeight  = metrics.heightPixels / density;
        this.dpWidth = (int)dpWidth;
        this.dpHeight = (int)dpHeight;

        Log.d(TAG, "zyxHeightDP: "+metrics.heightPixels / density);

        int id = this.getId();
        int increment = 10;
        int adjustment = getValueForLargeDevice(increment);


        if(id == R.id.betweenAddressAndTopBox) {
            doBetweenAddressAndTopBox(context, adjustment);
        } else if(id == R.id.betweenTopAndAddress) {
            doBetweenTopAndAddress(context, adjustment);
        }

        Log.d(TAG, "SettingHeight: "+adjustment);
        this.setBackgroundColor(Color.BLUE);
    }

    private void doBetweenAddressAndTopBox(Context context, int adjustment) {
        this.setMinimumHeight(adjustment);
    }

    private void doBetweenTopAndAddress(Context context, int adjustment) {
        this.setMinimumHeight(adjustment);
    }

    private int getValueForLargeDevice(double increment) {
        int largeDeviceAdjustment = 0;
        if(dpHeight > 750) {
            int difference = (int)dpHeight - 750;
            int interval = 25;
            int iterations =  (difference / interval) > 12 ? 12 : (difference / interval);
            int increasePerInterval = 0;
            for(int i=0; i < iterations; i++) {
                largeDeviceAdjustment += increment;
            }
            return largeDeviceAdjustment;
        } else {
            return 1;
        }
    }



}
4

1 に答える 1

1

あなたのコードは大丈夫だと思います。レイアウトに問題がある可能性があります。レイアウトは次のように設定しましたか?

    <com.example.dynamicspacerlayout.SummaryDynamicSpacer
      android:id="@+id/betweenAddressAndTopBox"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" >

minHeightは何かをしますか?

コードを実行しているGalaxyNexusスクリーンショット

ここに画像の説明を入力してください

Nexus7のスクリーンショット

ここに画像の説明を入力してください

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10" 
        android:hint="Top Text">

        <requestFocus />
    </EditText>

<com.example.dynamicspacerlayout.SummaryDynamicSpacer
    android:id="@+id/betweenAddressAndTopBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="@android:color/white"
         />
</com.example.dynamicspacerlayout.SummaryDynamicSpacer>

<EditText
    android:id="@+id/editText2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" 
    android:hint="Bottom Text"
    />

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            int minimumHeight = findViewById(R.id.betweenAddressAndTopBox).getHeight();
            TextView text = (TextView) findViewById(R.id.textView1);
            text.setText("Height: " + minimumHeight);
//              text.setVisibility(minimumHeight > 1 ? View.VISIBLE : View.GONE);
        }
    }, 1000);

}
}

お役に立てば幸いです。

于 2013-03-17T20:20:09.883 に答える