web-dev-qa-db-ja.com

フラグメントがAppCompatツールバーに重なっています

私はv7サポートライブラリを使用しており、左側にナビゲーションドロワーを配置しようとしています。他の場所で読むように、私はセットアップしました:

  1. DrawerTest.JavaToolbarのみを保持するカスタムXMLレイアウトから、setSupportActionBar()を使用してツールバーをロードするドロワーを保持するメインアクティビティ。

  2. toolbar.xml:ツールバーを保持するXMLレイアウト。

  3. activity_drawer_listview.xmlDrawerLayout XMLリソース。フラグメント(FrameLayout _<including>_のレイアウト)とナビゲーションドロワー(ListView)のコンテナーを保持します。 );

  4. FragmentTest.JavaFragment;を拡張した、いくつかの本当に単純なフラグメントコード。

  5. fragment_test_layout.xml:TextViewが内部にある、非常に単純なフラグメントレイアウト。

ここにいくつかのコードを貼り付けますが、とにかく私の問題は、フラグメントのレイアウトがToolbarの下部からではなく、画面の上部から始まるように見えることです。 5.に入力されたテキストは、アクションバーのアプリタイトルと重なります。私はどこが間違っていますか?

(1.)DrawerTest.Java

_    public class DrawerTest extends ActionBarCompat {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer_listview);

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        Toolbar tb = (Toolbar) findViewById(R.id.toolbar_main2);
        ActionBarDrawerToggle abDrawerToggle = new ActionBarDrawerToggle(
                        this, drawerLayout, tb,
                        R.string.navigation_drawer_open,
                        R.string.navigation_drawer_close )
        {
            // onDrawerClosed() { ... }
            // onDrawerOpened() { ... }
        };
        drawerLayout.setDrawerListener(abDrawerToggle);
        setSupportActionBar(tb);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        abDrawerToggle.syncState();

        //code to load my fragment
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.frame_layout_test, new FragmentTest()).commit();

        }
    }
_

(3.)activity_drawer_listview.xml

_    <Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools" Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent" Android:layout_height="match_parent"
    tools:context="miav.ciotole.DrawerTest">

    <FrameLayout Android:id="@+id/frame_layout_test" Android:layout_width="match_parent"
        Android:layout_height="match_parent" >
    <include layout="@layout/toolbar"/> <!-- What is this line about? -->
    </FrameLayout>

<ListView
        Android:id="@+id/left_drawer"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp" />
</Android.support.v4.widget.DrawerLayout>
_

(4.)FragmentTest.Java

_public class FragmentTest extends Fragment {

public FragmentTest() { }

@Override
public View onCreateView(LayoutInflater infl, ViewGroup container, Bundle SavedInstanceState) {
    View rootView = infl.inflate(R.layout.fragment_test_layout, container, false);
    return rootView;
}
_

}

(5.)fragment_test_layout.xml

_<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
Android:layout_height="match_parent"
// padding ...
>

<TextView Android:id="@+id/section_label" Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="@string/hello_world"/>
_

注:いくつかの質問(および回答)が見つかりましたが、ほとんどの場合、問題はAppCompatバージョン<19に関連しており、これは私の場合ではありません。

注2:ランタイムにツールバーを設定しているため、Theme.AppCompat.NoActionBarから継承しています。おそらく、Theme.AppCompatからの継承を解決し、setSupportActionBar()の使用を避けることができますが、可能であればActionBarの制御が容易になるため、実際の構成のままにします。

32
natario

その理由は、フレームレイアウトに配置してから、フラグメントをツールバーの上に追加するためです。あなたはこのようなことをする必要があります

<Android.support.v4.widget.DrawerLayout
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

       <LinearLayout
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       Android:orientation="vertical">

       <Android.support.v7.widget.Toolbar
           Android:id="@+id/toolbar"
           Android:layout_width="match_parent"
           Android:layout_height="wrap_content"
           Android:minHeight="?attr/actionBarSize"
           Android:background="?attr/colorPrimary"
           app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
           app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

       <FrameLayout
           Android:id="@+id/content_frame"
           Android:layout_width="match_parent"
           Android:layout_height="match_parent" />

       </LinearLayout>

       <FrameLayout
       Android:id="@+id/left_drawer"
       Android:layout_width="325dp"
       Android:layout_height="match_parent"
       Android:layout_gravity="start"
       Android:background="#FFFFFF"/>

</Android.support.v4.widget.DrawerLayout>
60
tyczj

FrameLayoutにこの行を追加します

app:layout_behavior="@string/appbar_scrolling_view_behavior"
6
Anand Kumar

ツールバーを同じFramelayoutに配置します(id = frame_layout_testを使用)。 FrameLayoutはビューとオーバーラップします。

私はあなたがこのようなことをしようとしていると思います:

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

<include layout="@layout/toolbar"/> 
<!-- I don't know what your Toolbar layout is -->


    <Android.support.v4.widget.DrawerLayout 
        Android:layout_width="match_parent" 
        Android:layout_height="0dp"
        Android:layout_weight="1" 
        tools:context="miav.ciotole.DrawerTest">

        <FrameLayout Android:id="@+id/frame_layout_test"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

        <ListView
            Android:id="@+id/left_drawer"
            Android:layout_width="240dp"
            Android:layout_height="match_parent"
            Android:layout_gravity="start"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp" />

    </Android.support.v4.widget.DrawerLayout>
</LinearLayout>

上からのレイアウトは線形レイアウトを取り、ツールバーの下にframelayout(framgemtを膨張させる場所)を配置します...

この行

Android:layout_height="0dp"
Android:layout_weight="1"

drawerLayoutはツールバーの下の残りの高さを取る必要があると言います。

ただし、従来のアクションバー/ツールバーを表示する場合は、xmlレイアウトにツールバーを追加する必要はありません。アクティビティのテーマを@style/Theme.AppCompat.Light.DarkActionBarに変更するだけです

1
sockeqwe

2つのアクティビティがあり、1つのフラグメントをそれらに添付します。最初のアクティビティでは右に表示されますが、2番目のアクティビティではツールバーと重なります。フラグメントのレイアウトの_Android:layout_marginTop="?android:attr/actionBarSize"_は解決策かもしれませんが、エラーが見つかりました。

Kotlinはidをキャッシュしますレイアウトのビュー(findViewById(R.id.some_id)の代わりに_some_id_を書くことができるため)には大きな問題があります。 アクティビティのコピーまたはフラグメントの場合、毎回非常に注意する必要があります。そのため、毎回インポートとアタッチされたレイアウトをチェックしてください

FirstActivityをSecondActivityにコピーし、activity_firstをactivity_secondにコピーしましたが、変更するのを忘れていました。

_override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_first) // Don't forget to change.
_

同様に、フラグメントでは忘れないでください:

_override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    val view = inflater.inflate(R.layout.fragment_yours, container, false)
_

だから、私の輸入品には:

_import kotlinx.Android.synthetic.main.activity_second.*
_

この場合、toolbarはactivity_secondを参照していますが、activity_firstは実際にアタッチされています。次に、フラグメントは上に移動しました-ツールバーのすぐ下に。ほとんどの場合、Kotlinはコンパイル時または実行時にキャッシュされたIDに問題を示すことはありません。それは大きな痛みです。

0
CoolMind

これは非常に簡単で簡単です。私が下に言おうとしたことに従ってください。

以下を使用して、ビューを置き換えます。

**

getFragmentManager().beginTransaction()
                .replace(R.id.blankFragment, new SettingsFragment())
                .commit();

** //ここで、blackFragmentはFrameLayout Viewのidです。 FrameLayoutビューをフラグメントのレイアウトに置き換えます。 注:FrameLayoutまたはFrameLayoutの派生レイアウトである必要があります。

私のコード全体は:

1)SettingsActivity.Java

**

public class SettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar2);
        mToolbar.setTitle("Settings");
////        remove the left margin from the logo
        mToolbar.setPadding(2, 0, 0, 0);//for tab otherwise give space in tab
        mToolbar.setContentInsetsAbsolute(0, 0);
        setSupportActionBar(mToolbar);
        // Display the fragment as the main content
        getFragmentManager().beginTransaction()
                .replace(R.id.blankFragment, new SettingsFragment())
                .commit();
    }
}

**

2)activity_fragment.xml

**

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    Android:orientation="horizontal">
    <!--scroll|snap-->
    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/statusbar"
        Android:minHeight="?attr/actionBarSize"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
    <FrameLayout
        Android:id="@+id/blankFragment"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="?attr/actionBarSize"
        Android:layout_gravity="top"
        Android:fitsSystemWindows="true"
        Android:orientation="horizontal" />
</FrameLayout>

** FrameLayoutのビューをFragmentのビューに置き換えた後、私の画面を見ることができます

enter image description here

0
Uddhav Gautam