19

Androidデバイスの全画面を想像してみてください。2つのセクションに分割したいと思います。

  1. 上半分にはテキストが含まれていますが、これは使用可能なスペースよりも大きい(またはない)可能性があるため、テキストはスクロールします(つまり、ScrollView内のTextView)
  2. 下半分にはMapViewコントロールが含まれています。

いくつかのシナリオを具体的に見てみましょう。

  1. テキストが小さい場合は、マップがより多くのスペース、つまり50%以上を占めるようにします。つまり、おそらく20%のテキスト、80%のマップです。
  2. テキストが大きい場合は、画面スペースの最大50%しか占めず、スクロールします。つまり、50%の地図、50%のテキストです。

現時点では、2つの部分に重みを割り当てていますが、それはそれほど悪くはありませんが、テキストが小さい場合、マップはスペースを取るために拡張されず、レイアウトにはマップが可能な無駄なギャップがあります。便利に使用します。

たくさんの組み合わせを試しましたが、これを実現する方法がわかりません。自分が何を望んでいるのかはわかっているのですが、それを実現するために利用可能なビューを取得する方法がわかりません。私はこれを行うための素晴らしい簡単な方法があることを望んでいます。

私をばかみたいに見せて、私が見逃した明らかな属性を指摘してください:-)

================================================== ====================

私が見る限り、これを宣言型XMLだけで行う方法はなく、コードで行う必要があります。テキストセクションの高さをwrap_contentに設定し、重みを0(サイズ変更なし)に設定し、マップを重み= 1に設定します(つまり、残りのスペースを占有します)。次に、(ScrollView内の)テキストセクションがスペースを占有しすぎていないかどうかを確認し、占有している場合は縮小します。このコードは、異なるレイアウト方向をサポートするように変更する必要があります。

private void fixLayoutProportions()
{
    float maxPercentageOfScreenForText = 50/100;
    LinearLayout container = (LinearLayout)findViewById(R.id.container);
    ScrollView eventText = (ScrollView)findViewById(R.id.text_scroller);
    int heightAvailable = container.getHeight();
    int scrollerHeight = eventText.getHeight();
    if ( scrollerHeight>(heightAvailable*maxPercentageOfScreenForText) )      // Text section using too much space
    {
        eventText.getLayoutParams().height = (int)(heightAvailable*maxPercentageOfScreenForText) ;
        eventText.invalidate();
    }
}
4

7 に答える 7

11

これを行うには、すべてをLinearLayoutに入れ、次のパラメーターを変更します。

于 2010-11-30T16:48:48.047 に答える
3

実行時に画面の高さを測定しようとしましたか?

Display display = ((WindowManager) 
      getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
int width = display.getHeight();

次に、上面ビューのmax_heightをwidth * 0.5に設定し、min_heightをwidth*0.2に設定します。トップビューは、min_heightプロパティとmax_heightプロパティを持つコントロール(TextViewなど)である必要があります。また、layout_weightを0に設定するか、空のままにします。底面図で、レイアウトの重みを1に設定します。

于 2010-11-30T16:05:07.487 に答える
2

50/50を実行する最も簡単な方法は、XMLでLinearLayoutウェイトを使用することです。基本的に、2つのビューを1つのLinearLayoutに配置し、両方の子ビューのandroid:layout_weightを同じ値に設定します。たとえば、両方を.5、1、または42に設定します。次に、layout_widthを0pxまたはfill_parent/match_parentに設定します。

小さい部分はより複雑になります。幸い、Javaでは計量をオフにすることができます。1つの方法は、ウィンドウが描画されるまで待機し(事前に入力されている場合)、それらを測定することです。これは、onWindowFocusChangedと呼ばれたと思います。

于 2012-09-19T15:42:32.030 に答える
0

わかりました。uのようなものが画面の最大半分でTextViewに予約されており、それ以上の場合はスクロールする必要があります。私には解決策がありますが、そのためには、TextViewの行の最大数を修正する必要があります。これは苦痛になる可能性があります:Pを計算しますが、解決策はそれ以下ではありません。

main.xmlファイル

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical"
    android:maxLines="5"
    android:id="@+id/tv1"
    android:text="wsdvsv sjdgv jsdvn ksdjbn skjdb ksdnbk snbk snbjksn fkbj sfkbjn dfkjbndkjfbn kdjfnb kjdfnbkjdnfbk ndf bjkndf bndfjbn dfkbn jdfnbjdfnbjdfn bjdf nbkjdnf bkjdfnb kjdnfbkjdfn bkjndfbjndfjbndkjfbn dkfjbn kdjfnb kjdfnbkjdfnbjkd nfkjbndf"
    />
 <TextView 
    android:layout_width="fill_parent" 
    android:layout_below="@id/tv1"
    android:layout_height="wrap_content" 
    android:scrollbars="vertical"
    android:maxLines="5"
    android:text="Does it work ???"
    />
</RelativeLayout>

Javaファイル:

package com.android;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;

public class TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.tv1);
        tv.setMovementMethod(new ScrollingMovementMethod());
    }
}

テキストが2行だけである場合「それは機能しますか?」自動的にシフトアップします。しかし、ここで私が見る唯一の問題は、5までの最大行数です。これはうまくいくかもしれないとUIの最大値を推測できることです:)

BR、J

PS私はこれまで多くの質問に答えたことがないので、ファイルを添付する方法がわかりません:(

于 2011-01-03T17:34:16.807 に答える
0

私はこれをテストしていませんが、ScrollViewを持っているように設定してみてandroid:layout_weight="1"ください。minHeightがlayout_weightよりも優先されることが期待されます。MapViewandroid:layout_weight="0"android:minHeight="240dp"

于 2010-11-30T15:35:15.863 に答える
0

mapviewsの高さを塗りつぶしの親として設定し、textviewsの高さをwrap contetnとして設定する必要があると思います。スクロールよりも、テキストビューに対して垂直方向のscroolをtrueに設定する必要があり、50%以下のスペースtextviewを必要とするため、textviewのmaxheightプロパティを設定できます。

于 2011-01-10T11:36:09.327 に答える
0

些細なことだと思ったらごめんなさい。しかし、それがあなたを襲わなかった場合に備えて、私はそれを提案しています。相対レイアウトを使用して、テキストビューを常にマップの上に配置するのはどうですか。textview topの重力、幅をmatch_parent、高さをwrap_content、重みを1(マップと同じ)にします。そうすれば、テキストビューはテキストのサイズに応じて変化しますが、重みのために50%を超えることはありません。地図に関しては、ユーザーは地図を下に引いて、テキストビューの下に隠された部分を見ることができます。textviewの下にマップがないかのようになります(textviewの背景を透明にしたい場合を除いて、私はクールに見えると思います:))。マップビューについてはわかりません。しかし、マルチタッチを使用してサイズを変更したり、シングルを使用してスクロールしたりできるように、iPhoneのグーグルマップのようなものになると思います。

于 2011-01-12T16:15:17.980 に答える