Androidのすべての上にビューを重ねることができますか?
IPhoneでは、新しいビューのframe.Origin
を(0,0)に設定し、幅と高さをself.view
の幅と高さに設定します。これをself.view
に追加すると、オーバーレイとして機能し、背後のコンテンツをカバーします(または透明な背景があり、背後にビューが表示されている場合)。
アンドロイドに同様の手法がありますか?ビューはわずかに異なることを認識しています(3つのタイプ(またはそれ以上...)relativelayout、linearlayout、framelayoutがあります)が、すべてを無差別にビューにオーバーレイする方法はありますか?
単にRelativeLayout
またはFrameLayout
を使用してください。最後の子ビューは他のすべてをオーバーレイします。
Androidは、Cocoa Touch SDKがサポートしていないパターンをサポートしています:レイアウト管理。
Layoutは、iPhoneのすべてを絶対位置に配置することを意味します(いくつかのストレッチ要因を除く)。 Androidのレイアウトは、子が互いに関連して配置されることを意味します。
例(2番目のEditTextは最初のEditTextを完全にカバーします):
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/root_view">
<EditText
Android:layout_width="fill_parent"
Android:id="@+id/editText1"
Android:layout_height="fill_parent">
</EditText>
<EditText
Android:layout_width="fill_parent"
Android:id="@+id/editText2"
Android:layout_height="fill_parent">
<requestFocus></requestFocus>
</EditText>
</FrameLayout>
FrameLayout
は、ある種のビュースタックです。特殊なケース用に作られています。
RelativeLayout
は非常に強力です。 ビューAは親レイアウトを下に揃える必要があります、ビューBはAを下から上に揃える必要がありますなど
コメントに基づいて更新
通常、コンテンツはonCreate
のsetContentView(R.layout.your_layout)
で設定します(レイアウトが自動的に拡張されます)。それを手動で行い、setContentView(inflatedView)
を呼び出すことができますが、違いはありません。
ビュー自体は、単一のビュー(TextView
など)または複雑なレイアウト階層(すべてのレイアウトがビュー自体であるため、ネストされたレイアウト)である場合があります。
setContentView
を呼び出した後、アクティビティはそのコンテンツがどのように見えるかを知っており、(FrameLayout) findViewById(R.id.root_view)
を使用してこの階層内のビューを取得できます(一般パターン(ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view)
)。
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/root_view"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<LinearLayout
Android:id = "@+id/Everything"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<!-- other actual layout stuff here EVERYTHING HERE -->
</LinearLayout>
<LinearLayout
Android:id="@+id/overlay"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="right" >
</LinearLayout>
これで、Android:id = "@+id/overlay"
でLinearLayoutの下に追加したビューは、Android:id="@+id/Everything"
で線形レイアウトにgravity = rightでオーバーレイとして表示されます
bringToFront
を使用できます:
View view=findViewById(R.id.btnStartGame);
view.bringToFront();
最善の方法は ViewOverlay です。Android JellyBeanMR2(Api 18)以降、オーバーレイとしてドロアブルをオーバーレイとして任意のビューに追加できます。
mMyDrawable
にオーバーレイとしてmMyView
を追加します。
mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)
私は以前にオーサーを試しましたが、これはうまくいきませんでした。私はjsutがTextureViewの代わりにLinearLayoutを使用しましたが、現在は問題なく動作しています。同じ問題を抱えている他の人の助けになることを願っています。 :)
view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor
openWindowOnButtonClick();
public void openWindowOnButtonClick()
{
view.setAlpha((float)0.5);
FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton);
final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE);
fb.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// check if the Overlay should be visible. If this value is false, it is not shown -> show it.
if(view.getVisibility() == View.INVISIBLE)
{
view.setVisibility(View.VISIBLE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
Log.d("Overlay", "Klick");
}
else if(view.getVisibility() == View.VISIBLE)
{
view.setVisibility(View.INVISIBLE);
keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
}