【问题标题】:Opening a Fragment from a Fragment imageButton Click?从片段图像按钮打开片段单击?
【发布时间】:2014-12-28 12:02:23
【问题描述】:

我遇到了从另一个片段打开片段的问题。我的主要活动实现了最新的导航抽屉,导航栏列表中的每个选项都会打开一个新片段。这么多已经实施并且运作良好。我遇到的问题是下一层碎片。我有一个带有 imageButton 的事件片段。单击此按钮后,我需要导航到此子事件的新片段。我尝试在打开子事件页面的事件片段中创建一个 onclicklistener,但出现以下错误。

未找到片段 imageFragment1 {348db088 #0 id=0x7f08000a} 的 id 0x7f08000a (com.ikimuhendis.ldrawer.sample:id/imagefrag) 的视图

public class EventFragment extends Fragment

{
    ImageButton test;

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

        SliderLayout sliderShow = (SliderLayout) rootView.findViewById(R.id.slider);
        sliderShow.setDuration(8000);
        sliderShow.setPresetTransformer(SliderLayout.Transformer.ZoomOut);

        //get the button view
        test = (ImageButton) rootView.findViewById(R.id.imageButton);

        test.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Fragment videoFragment = new imageFragment1();
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
                transaction.replace(R.id.imagefrag, videoFragment)
                        .commit();
            }

        });

        HashMap<String, Integer> file_maps = new HashMap<String, Integer>();
        file_maps.put("Munster Vs Leinster", R.drawable.rugby);
        file_maps.put("Ennio Morricone", R.drawable.ennio);
        file_maps.put("Leinster Vs Harlequins", R.drawable.heino);
        file_maps.put("WWE Live", R.drawable.wwe);

        for (
                String name
                : file_maps.keySet())

        {
            TextSliderView textSliderView = new TextSliderView(getActivity());
            textSliderView
                    .description(name)
                    .image(file_maps.get(name));
            sliderShow.addSlider(textSliderView);
        }

        getActivity().setTitle("Events");
        return rootView;
    }
}

上面的代码是用来打开这个图片片段的

public class imageFragment1 extends Fragment {

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

        return rootView;
    }
}

imageFragment1 xml 代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@id/imagefrag" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="This is a test"
        android:id="@+id/textView"
        android:layout_marginTop="41dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

How to replace the activity's fragment from the fragment itself?

我很不确定片段事务应该在哪里进行。在我的主要活动中,片段事务发生在导航抽屉的开关块中。我读过“请注意,片段不应该直接替换自己或任何其他片段。片段应该是单独的实体。片段应该做的是通知其父活动发生了某些事件。但它再次不是片段作业来决定如何处理它!决定替换手机上的片段应该是活动,但要在平板电脑上的现有片段中添加另一个片段。所以你基本上在设计上做错了“

另一张海报提到“处理这种情况的更好方法是为主要活动创建一个回调实现来处理请求,例如启动一个新片段”我如何在我的主要活动中进行设置,以便它与我的抽屉碎片的子碎片。对此的任何想法都非常感谢。

主要活动

    public class SampleActivity extends Activity {

        private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        private ActionBarDrawerToggle mDrawerToggle;
        private DrawerArrowDrawable drawerArrow;
        private CharSequence mDrawerTitle;
        private CharSequence mTitle;
        CustomDrawerAdapter adapter;
        List<DrawerItem> dataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);
        ActionBar ab = getActionBar();
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);

        dataList = new ArrayList<DrawerItem>();
        dataList.add(new DrawerItem("Home", R.drawable.home));
        dataList.add(new DrawerItem("How It Works", R.drawable.howitworks));
        dataList.add(new DrawerItem("Events", R.drawable.events));
        dataList.add(new DrawerItem("Profile", R.drawable.signin));

        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.navdrawer);

        drawerArrow = new DrawerArrowDrawable(this)
        {
            @Override
            public boolean isLayoutRtl() {
                return false;
            }
        };

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            drawerArrow, R.string.drawer_open,R.string.drawer_close)
        {

            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerToggle.syncState();
        adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
                dataList);
        /* ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, android.R.id.text1, mNames); */
        mDrawerList.setAdapter(adapter);
        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                {
                    displayView(position);
                    // Running Fragment Transaction code here
                }
            }

             // Method that updates content frame with different fragments
            private void displayView(int position) {
             // update the main content by replacing fragments

                Fragment fragment = null;
                Bundle args = new Bundle();
                switch (position) {
                    case 0:
                        fragment = new TitleFragment();
                        mDrawerToggle.setAnimateEnabled(true);
                        drawerArrow.setProgress(1f);
                        mDrawerToggle.syncState();
                        break;
                    case 1:
                        fragment = new HowFragment();
                        mDrawerToggle.setAnimateEnabled(true);
                        drawerArrow.setProgress(1f);
                        mDrawerToggle.syncState();
                        break;
                    case 2:
                        fragment = new EventFragment();
                        mDrawerToggle.setAnimateEnabled(true);
                        drawerArrow.setProgress(1f);
                        mDrawerToggle.syncState();
                        break;
                    case 3:
                        fragment = new ProfileFragment();
                        mDrawerToggle.setAnimateEnabled(true);
                        drawerArrow.setProgress(1f);
                        mDrawerToggle.syncState();
                        break;
                }
                    fragment.setArguments(args);
                    FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction()
                            .replace(R.id.content_frame, fragment).addToBackStack(null).commit();

                    // update selected item and title, then close the drawer
                    mDrawerList.setItemChecked(position, true);
                    setTitle(dataList.get(position).getItemName());
                    mDrawerLayout.closeDrawer(mDrawerList);
            }
        });

    }

    @Override
    public void setTitle(CharSequence title)
    {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // The action bar home/up action should open or close the drawer.
        // ActionBarDrawerToggle will take care of this.
        if (mDrawerToggle.onOptionsItemSelected(item))
        {
            return true;
        }
        return false;
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

}

【问题讨论】:

  • 创建一个interface,它有一个打开fragment的方法,在fragment中创建一个实例并为此生成setter并调用方法,在activity中实现接口并通过this设置fragment实例,活动中的细句柄片段转换
  • 可以看代码示例吗?我不确定如何实现。

标签: java android android-layout android-fragments navigation-drawer


【解决方案1】:

正如评论中所建议的,您必须制作自定义界面。通过接口,Fragment 可以与其父 Activity 进行通信。

在您的 Fragment 中,您有按钮:

private OnDataPass dataPasser;

//Interface, trought the fragment can comunicate with activity
public interface OnDataPass {
    public void onDataPass();
}

//Method, which you call in your onClickListener
public void passData() {
    // Method in the Activity
    dataPasser.onDataPass();
}

//Method, which creates the interface
@Override
public void onAttach(Activity a) {
    super.onAttach(a);
    try {
        dataPasser = (OnDataPass) a;
    } catch (ClassCastException e) {
        throw new ClassCastException(a.toString() + " must implement onDataPass");
    }
}

在你的活动中:

// You can also pass arguments, if you need
@Override
public void onDataPass() {

    //Do your code for switching the fragments or anything else
    ...

}

你的 Activity 必须实现这个监听器:

public class ActivityMain extends Activity implements OnDataPass{

但是下次在提问之前尝试进行更多研究,这个话题有很多问题。 Example.

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 2015-12-18
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多