代码之家  ›  专栏  ›  技术社区  ›  salim

为每个片段添加操作栏

  •  2
  • salim  · 技术社区  · 7 年前

    假设我在mainActivity中放了4个片段,我想在每个frgament中创建不同的actionbar。

    当我按下fragment 1时,actionBar显示fragment 1,当我按下两个出现属于fragment 2的actionBar的片段时

    01-02 20:12:33.700 15035-15035/src.go_letskerja E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: src.go_letskerja, PID: 15035
                                                                  java.lang.NullPointerException
                                                                      at src.go_letskerja.Fragment.OtherFragment.onCreateView(OtherFragment.java:26)
                                                                      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                      at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
                                                                      at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
                                                                      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
                                                                      at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
                                                                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
                                                                      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
                                                                      at android.os.Handler.handleCallback(Handler.java:733)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:136)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5113)
                                                                      at java.lang.reflect.Method.invokeNative(Native Method)
                                                                      at java.lang.reflect.Method.invoke(Method.java:515)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
                                                                      at dalvik.system.NativeStart.main(Native Method)
    

    这是我的活动:

        package src.go_letskerja.Fragment;
    
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.AppCompatActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import src.go_letskerja.R;
    
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class OtherFragment extends Fragment {
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View v = inflater.inflate(R.layout.fragment_other, container, false);
    
            ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("TES");
            //((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(R.layout.actionbar);
    
            return v;
        }
    }
    

    这是我的XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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:orientation="vertical">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:fitsSystemWindows="true"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:text="Tinggi Badan"
            android:textSize="14dp" />
    
        <TextView
            android:id="@+id/tinggibadan"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="15dp"
            android:paddingLeft="30dp"
            android:paddingTop="10dp"
            android:text="000 Cm"
            android:textSize="20dp"
            android:textStyle="bold" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/list" />
    
    
    </LinearLayout>
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Farhana Naaz Ansari Jay Dwivedi    7 年前

    是的,您可以将自定义工具栏添加到片段中,使活动主题在清单中没有操作栏,并执行类似操作。此布局可能是您的碎片布局,并在活动中膨胀。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:layout_alignParentTop="true"
        android:background="@color/colorPrimary"
        android:gravity="top"
        app:titleTextColor="@color/white">
    
        <ImageView
            android:id="@+id/iv_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:contentDescription="TODO"
            android:visibility="visible"
            app:srcCompat="@drawable/ic_back" />
    
        <TextView
            android:id="@+id/toolbar_title"
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="List Entry"
            android:textColor="@color/white"
            android:textSize="@dimen/large_text_size" />
    
        <ImageView
            android:id="@+id/iv_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_margin="@dimen/middium_padding"
            android:contentDescription="TODO"
    
            android:src="@mipmap/add"
            android:visibility="visible" />
    
    </android.support.v7.widget.Toolbar>
    
    
    </RelativeLayout>
    

    并使用framgment视图访问工具栏。

        2
  •  3
  •   Oleg Gryb    4 年前

    在这种情况下,您通常会:

    • 拥有并包含片段的活动和布局,我们称之为FragmentOwnerActivity。kt和fragment\u owner\u布局。xml
    • 一个派生自Fragment的类和与之相关的布局,让我们称它们为MyFragment。kt和my\u fragment\u布局。xml

    要在片段中启用工具栏,您需要将以下内容放到my\u fragment\u布局中。xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/someid"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MyFragment">
    
        <android.support.design.widget.AppBarLayout
                android:id="@+id/appbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                android:layout_marginStart="0dp"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginTop="0dp"
        >
    
            <android.support.v7.widget.Toolbar
                    android:id="@+id/my_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="@attr/actionBarSize"
                    android:background="@attr/colorPrimary"
                    android:contentInsetEnd="0dp"
                    android:contentInsetLeft="0dp"
                    android:contentInsetRight="0dp"
                    android:contentInsetStart="0dp"
                    android:elevation="2dp"
                    app:contentInsetEnd="0dp"
                    app:contentInsetLeft="0dp"
                    app:contentInsetRight="0dp"
                    app:contentInsetStart="0dp"
    
            >
    
                <TextView
                        android:id="@+id/toolbar_title"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="@string/toolbar_title"
                        android:textSize="22sp"
                        android:textStyle="bold" />
    
            </android.support.v7.widget.Toolbar>
    

    在MyFragment中。kt您需要启用工具栏:

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        (activity as AppCompatActivity).setSupportActionBar(view?.findViewById(R.id.my_toolbar))
    

    在FragmentOwnerActivity中。kt您需要膨胀特定于片段的菜单和处理菜单单击事件

    // You'll need to create an xml with a menu for your fragment
    // and then use it in inflate function below
    override  fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.my_fragment_menu_id, menu)
        return true
    }
    
    
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle item selection
        when (item.getItemId()) {
            R.id.menu_item1_id -> {
                doMenuItem1()
                return true
            }
            R.id.menu_item2_id -> {
                doMenuItem2()
                return true
            }
            else -> return super.onOptionsItemSelected(item)
        }
    }
    

    最后,您的fragment\u owner\u布局。xml只是控制其他框架的FrameLayout元素

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MyFragmentOwner"/>