Android - SlideMenu和片段

时间:2013-12-05 09:10:24

标签: android android-fragments

我已经按照教程逐步创建了一个滑动菜单并且它可以工作,但是在代码中我注意到当用户触摸菜单项时代码将运行这段代码:

MainActivity:

....
/**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }
/**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:{
                fragment = new PersonaggiPrincipali();
                break;
            }
            case 1:{
                fragment = new PersonaggiSecondari();
                break;
            }
            case 2:{
                fragment = new Video();
                break;
            }
            default:
                break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }
....

基本上,当点击该项目时,它会调用新的Class 该课程以这种方式形成:

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class PersonaggiPrincipali extends Fragment {

    public PersonaggiPrincipali(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.personaggi_principali, container, false);

        return rootView;
    }

}

所以它只返回布局,上面的displayView函数会用返回的那个替换当前的,对吗?

if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();
....
}

我的问题是,在返回的视图中,如果类只是布局的返回,我该如何操作呢?

例如,让我们假设在返回的视图中我有一个Button,我需要设置一个ClickListener或者只是创建一个函数来改变Activity(应该在主视图中插入的活动) SlidingMenu),我该怎么做?

我应该写MainActivity中的所有代码来管理吗?

2 个答案:

答案 0 :(得分:1)

您可以使用相同的(onCreateView())方法执行此操作。此外,您可以在PersonaggiPrincipali类的片段布局中包含对视图的私有引用。同时为这些视图实现get()方法,您可以从MainActivity更改它们。 例如:

public class PersonaggiPrincipali extends Fragment {
     private Button fragButton;
     public PersonaggiPrincipali(){}

     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.personaggi_principali, container, false);
         fragButton = (Button) rootView.findViewById(R.id.fragButtonId); //replace R.id.fragButtonId with the appropriate Id from your xml layout
         return rootView;
     }
     public Button getFragButton() {
         return this.fragButton;
     }
}

答案 1 :(得分:1)

Ciao Christian,当你实例化一个Fragment时,除了Fragment之外你没有得到一个观点。

onCreateView方法只是片段生命周期的一部分,您必须返回片段的主视图。此外,如果您的片段有Button,则可以在片段的onCreateView方法中设置侦听器。

http://developer.android.com/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)

示例:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{   
    View rootView = inflater.inflate(R.layout.personaggi_principali, container, false);

    Button button = (Button) rootView.findViewById(R.id.REPLACE_WITH_YOUR_BUTTON_ID);
    button.setOnClickListener(new OnClickListener()
        {   
            @Override
            public void onClick(View v)
            {
                // do you stuff here...
            }
        });

    return rootView;
}

请注意示例中的Button只是一个局部变量,如果以后需要访问它,最好将其声明为类变量。

关于沟通(FragmentFragment,托管ActivityFragment),我认为您需要了解的所有内容都在官方文档中得到了充分解释:{{3 }}