私はv7サポートライブラリを使用しており、左側にナビゲーションドロワーを配置しようとしています。他の場所で読むように、私はセットアップしました:
DrawerTest.Java:Toolbar
のみを保持するカスタムXMLレイアウトから、setSupportActionBar()
を使用してツールバーをロードするドロワーを保持するメインアクティビティ。
toolbar.xml:ツールバーを保持するXMLレイアウト。
activity_drawer_listview.xml:DrawerLayout
XMLリソース。フラグメント(FrameLayout _<including>
_のレイアウト)とナビゲーションドロワー(ListView)のコンテナーを保持します。 );
FragmentTest.Java:Fragment
;を拡張した、いくつかの本当に単純なフラグメントコード。
ここにいくつかのコードを貼り付けますが、とにかく私の問題は、フラグメントのレイアウトが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の制御が容易になるため、実際の構成のままにします。
その理由は、フレームレイアウトに配置してから、フラグメントをツールバーの上に追加するためです。あなたはこのようなことをする必要があります
<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>
FrameLayoutにこの行を追加します
app:layout_behavior="@string/appbar_scrolling_view_behavior"
ツールバーを同じ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
に変更するだけです
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に問題を示すことはありません。それは大きな痛みです。
これは非常に簡単で簡単です。私が下に言おうとしたことに従ってください。
以下を使用して、ビューを置き換えます。
**
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のビューに置き換えた後、私の画面を見ることができます