widget.FrameLayout $ LayoutParams无法强制转换为android.support.v4.widget.DrawerLayout $ LayoutParams

时间:2015-09-16 15:23:32

标签: android android-fragments

我想要运行的FragmentViewPager包含2 NavigationDrawer的问题。我们的想法是通过从Activity

中进行选择来更改主要片段

我在运行时遇到以下错误:

fragments

包含NavigationDrawer Process: XXXX, PID: 31040 java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:1129) at android.support.v4.widget.DrawerLayout.isDrawerOpen(DrawerLayout.java:1379) at XXXX.NavigationDrawerFragment.isDrawerOpen(NavigationDrawerFragment.java:117) at XXXX.EditFactFind.onCreateOptionsMenu(EditFactFind.java:192) at android.app.Activity.onCreatePanelMenu(Activity.java:2846) at com.android.internal.policy.PhoneWindow.preparePanel(PhoneWindow.java:567) at com.android.internal.policy.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:939) at com.android.internal.policy.PhoneWindow$1.run(PhoneWindow.java:271) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 的我的activity是:

fragments

我的XML <?xml version="1.0" encoding="utf-8"?> <!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. --> <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="XXXX.MainActivity"> <!-- As the main content view, the view below consumes the entire space available using match_parent in both dimensions. --> <FrameLayout android:layout_width="match_parent" android:layout_height="250dp" android:id="@+id/fragment_container" android:layout_alignParentBottom="true"> <!-- android:layout_gravity="start" tells DrawerLayout to treat this as a sliding drawer on the left side for left-to-right languages and on the right side for right-to-left languages. If you're not building against API 17 or higher, use android:layout_gravity="left" instead. --> <!-- The drawer is given a fixed width in dp and extends the full height of the container. --> <fragment android:id="@+id/navigation_drawer" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" android:name="XXXX.NavigationDrawerFragment" tools:layout="@layout/fragment_navigation_drawer" /> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/editFactFindTop" android:name="XXXX.editFactFind_top" tools:layout="@layout/fragment_edit_fact_find_top"/> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="3" android:id="@+id/fragment_editFactFind" android:name="XXXX.secA_pg1" tools:layout="@layout/fragment_sec_a_pg1" /> </FrameLayout> </android.support.v4.widget.DrawerLayout> 是:

NavigationDrawer

My Top片段XML是:

XML

我的主要片段XML是:

<ListView 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"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#cccc"
    tools:context=".NavigationDrawerFragment" />

我的<android.support.v4.widget.DrawerLayout 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" tools:context="XXXX.editFactFind_top"> <FrameLayout android:layout_width="match_parent" android:layout_height="250dp" android:id="@+id/fragment_container" android:layout_alignParentBottom="true"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textAppearance="?android:attr/textAppearanceSmall" android:text="@string/titleEditText" android:id="@+id/titleViewText" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/titleViewText" android:layout_alignBaseline="@id/titleViewText" android:id="@+id/titleEditText"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/titleEditText" android:layout_alignBaseline="@id/titleViewText" android:layout_alignParentRight="true" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_marginLeft="20dp" android:text="@string/dateTextView" android:id="@id/dateTextView" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/saveButton" android:id="@id/saveButton" android:layout_below="@id/titleEditText" android:layout_marginTop="50dp" android:visibility="visible" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancelButton" android:layout_marginLeft="10dp" android:id="@id/cancelButton" android:layout_toRightOf="@id/saveButton" android:layout_alignBaseline="@id/saveButton" android:visibility="visible" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Next" android:id="@+id/nextButton" android:layout_alignBaseline="@id/cancelButton" android:layout_toRightOf="@id/cancelButton"/> </RelativeLayout> </FrameLayout> </android.support.v4.widget.DrawerLayout> java是:

<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="XXXX.secA_pg1">

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        <TextView android:layout_width="match_parent" android:layout_height="match_parent"
            android:text="@string/Sec_A_pg1_fragment"
            android:id="@+id/Sec_A_pg1_fragment"
            android:layout_below="@id/nextButton"/>


        </RelativeLayout>
    </FrameLayout>
</android.support.v4.widget.DrawerLayout>

最后我的editFactFind java是

public class EditFactFind extends Activity implements NavigationDrawerFragment.NavigationDrawerCallbacks {

    public static final int RESULT_DELETE = -500;
    private boolean isInEditMode = true;
    private boolean isAddingFactFind = true;
    private NavigationDrawerFragment mNavigationDrawerFragment;
    private CharSequence mTitle;

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

        final Button saveButton = (Button)findViewById(R.id.saveButton);
        final Button cancelButton = (Button)findViewById(R.id.cancelButton);
        final EditText titleEditText = (EditText)findViewById(R.id.titleEditText);
        //final EditText factFindEditText = (EditText)findViewById(R.id.factFindEditText);
        final TextView dateTextView = (TextView)findViewById(R.id.dateTextView);
        final Button nextButton =(Button) findViewById(R.id.nextButton);

        //Create fragment and give it an argument for the selected article
        secA_pg1 iniSecFrag = new secA_pg1();
        Bundle args = new Bundle();
        args.putInt(secA_pg1.ARG_INDEX, 1);
        iniSecFrag.setArguments(args);

        FragmentTransaction initialTransaction = getFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack so the user can navigate back
        //initialTransaction.replace(R.id.fragment_container, iniSecFrag);
       // initialTransaction.addToBackStack(null);
       // Fragment iniSecFrag = new secA_pg1();
        initialTransaction.add(R.id.fragment_container, iniSecFrag);
        //Commit the transaction
        initialTransaction.commit();

        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getFragmentManager().findFragmentById(R.id.navigation_drawer); // Activity_nav_drawer.xml
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));

        Serializable extra = getIntent().getSerializableExtra("FactFind");
        if(extra != null)
        {
            FactFind factFind = (FactFind) extra;
            titleEditText.setText(factFind.getTitle());
          //  factFindEditText.setText(factFind.getFactFindTitle());

            DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
            String date = dateFormat.format(factFind.getDate());

            dateTextView.setText(date);

            isInEditMode = false;
            titleEditText.setEnabled(false);
          //  factFindEditText.setEnabled(false);
            saveButton.setText("Edit");

            isAddingFactFind = false;

        }

        cancelButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                setResult(RESULT_CANCELED, new Intent());
                finish();
            }
        });

        nextButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //secA_pg1 secFrag = (secA_pg1) getFragmentManager().findFragmentById(R.id.Sec_A_pg1_fragment);
                //Create fragment and give it an argument for the selected article
                secA_pg2 newSecFrag = new secA_pg2();
                Bundle args = new Bundle();
                args.putInt(secA_pg2.ARG_INDEX, 2);
                newSecFrag.setArguments(args);

                FragmentTransaction transaction = getFragmentManager().beginTransaction();

                // Replace whatever is in the fragment_container view with this fragment,
                // and add the transaction to the back stack so the user can navigate back
                transaction.replace(R.id.fragment_editFactFind, newSecFrag);
                transaction.addToBackStack(null);

                //Commit the transaction
                transaction.commit();
            }
        });

        saveButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


                if(isInEditMode)
                {
                    Intent returnIntent = new Intent();
                    FactFind factFind = new FactFind(titleEditText.getText().toString(),Calendar.getInstance().getTime());
                    returnIntent.putExtra("FactFind", factFind);
                    setResult(RESULT_OK, returnIntent);
                    finish();

                }
                else
                {
                    isInEditMode = true;
                    saveButton.setText("Save");
                    titleEditText.setEnabled(true);
                   // factFindEditText.setEnabled(true);
                }

            }
        });
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(R.string.are_you_sure_you_want_to_delete_this_fact_find_it_can_t_be_undone_);
        builder.setTitle("Confirm Delete");
        builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent returnIntent = new Intent();

                setResult(RESULT_DELETE, returnIntent);
                finish();

            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
            }
        });

        builder.create().show();
        return false;

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.nav_drawer, menu);
            restoreActionBar();
            return true;
        }
        else {
            //return super.onCreateOptionsMenu(menu);
            getMenuInflater().inflate(R.menu.action_menu, menu);
            return true;
        }
    }
    //@Override
    public void onSelectedFragChanged(int index) {
        FragmentManager fragmentManager = getFragmentManager();
        secA_pg1 secA_pg1 = (secA_pg1) fragmentManager.findFragmentById(R.id.Sec_A_pg1_fragment);

        secA_pg1.setSectionTitle(index);
    }

    public void restoreActionBar() {
        ActionBar actionBar = getActionBar();
        //actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {

    }
}

我尝试了几件事,从研究和错误中我相信我的一个XML文件布局不正确,它将其视为框架布局而不是抽屉但我无法弄清楚哪里。我曾尝试以多种方式修改版面,但没有运气。

谢谢:)

2 个答案:

答案 0 :(得分:1)

看起来这里有一些问题,除非我错过了一些你想要实现的更复杂的东西。 首先,当您使用此DrawerLayout时,它应该将内容和抽屉放在单独的部分中,而这里所有内容都分组在一个FrameLayout下。 XML的基本结构如下:

<android.support.v4.widget.DrawerLayout>
    <FrameLayout>
        your main content stuff here
    </FrameLayout>
    <FrameLayout>
         navigationdrawer stuff here
    </FrameLayout>
</android.support.v4.widget.DrawerLayout>

他们不必同时都是FrameLayouts,但重要的是有两个子视图,它们按顺序排列。 Have a look at the guidance here.

另一个主要结构是你在所有碎片中也不需要DrawerLayout。 DrawerLayout属于Activity,每个片段只能显示其内容。

答案 1 :(得分:0)

我认为您的问题是FrameLayout内容的元素不应包含布局中的任何其他视图。 例如,在主片段中,您的布局应如下所示:

<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="XXXX.secA_pg1">

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
            <TextView android:layout_width="match_parent" android:layout_height="match_parent"
            android:text="@string/Sec_A_pg1_fragment"
            android:id="@+id/Sec_A_pg1_fragment"
            android:layout_below="@id/nextButton"/>
    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

请记住,在调用isDrawerOpen(View抽屉)方法时,您应该将RelativeLayout(在此示例中)作为参数传递,实际上是抽屉视图,并且此视图必须指定其水平重力与android:layout_gravity属性。

我的答案基于DrawerLayout的官方文档: https://developer.android.com/training/implementing-navigation/nav-drawer.html