打开片段在现有的片段(主详细设计) [英] Opening a fragment in an existing fragment (Master Detail Design)

查看:258
本文介绍了打开片段在现有的片段(主详细设计)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

:)

我在使用中的Andr​​oid主详细信息视图从现有的片段打开另一个片段的问题。我已经试过各种解决方案,但没有任何帮助。
我有一个列表视图作为一个菜单,在这里我可以点击不同的项目。通过点击,右片段将被打开。在一个特殊的片段,我想实现一个按钮,应该用另一个替换现有的片段,但这不起作用。我添加了一个敬酒,看的onclick方法的工作,它的工作,仅仅是片段交换机不会做他的工作。任何人都可以请帮我或给我任何提示,我即将拉开吓坏了! :D

 个人按钮btnLogin;btnLogin =新按钮(getActivity());
btnLogin.setLayoutParams(PARAMS);
btnLogin.setText(登录);btnLogin.setOnClickListener(新OnClickListener(){
        @覆盖
        公共无效的onClick(查看rootView){
            吐司面包= Toast.makeText(getActivity(),注册,
                    Toast.LENGTH_SHORT);
            toast.show();            片段片段=新FragmentApps();
            FragmentTransaction交易= getFragmentManager()
                    .beginTransaction();            //如果(addToBack)
            transaction.addToBackStack(NULL);            transaction.replace(R.id.fragment_item_detail_1,片段).commit();
        }
    });

这是错误消息我得到:

 十一月12日至3日:30:06.839:E / AndroidRuntime(9464):致命异常:主要
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):工艺:at.test.app,PID:9464
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):显示java.lang.NullPointerException:尝试对空对象引用调用虚方法'布尔android.os.Bundle.containsKey(java.lang.String中)'
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在at.test.app.apps.FragmentApps.onCreate(FragmentApps.java:49)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.Fragment.performCreate(Fragment.java:2031)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.BackStackRecord.run(BackStackRecord.java:833)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:447)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.os.Handler.handleCallback(Handler.java:739)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.os.Handler.dispatchMessage(Handler.java:95)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.os.Looper.loop(Looper.java:135)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在android.app.ActivityThread.main(ActivityThread.java:5221)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在java.lang.reflect.Method.invoke(本机方法)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在java.lang.reflect.Method.invoke(Method.java:372)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)
十一月12日至3日:30:06.839:E / AndroidRuntime(9464):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

在此先感谢您的帮助!

编辑 - >全code:
    包at.test.app.login;

 进口android.os.Bundle;
进口android.app.Activity;
进口android.app.Fragment;
进口android.app.FragmentTransaction;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.LinearLayout;
进口android.widget.TextView;
进口android.widget.Toast;
/ **
 *片段重新presenting单个项目的细节画面。这个片段可以是
 *包含在{@link ItemListActivity}在两窗格模式(片)或
 *在手机上{@link ItemDetailActivity}。
 * /
公共类FragmentTest扩展片段{    私人的LinearLayout的LinearLayout;
    私人TextView的样本;
    私人按钮btnLogin;    / **
     *片段参数重新presenting项ID,该片段
     *重新presents。
     * /
    公共静态最后弦乐ARG_ITEM_ID =ITEM_ID;    / **
     *虚设内容,此片段是presenting。
     * /
    私人ItemContent.Item MITEM;    / **
     *必须填写空构造函数片段经理来实例化
     *片段(例如在屏幕方向变化)。
     * /
    公共FragmentTest(){
    }    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        。getActivity()的setTitle(getResources()的getString(R.string.apps_titel));        如果(getArguments()。的containsKey(ARG_ITEM_ID)){
            //加载的片段指定的虚拟内容
            //参数。在真实的场景中,使用Loader
            //从内容提供商加载内容。
            MITEM = ItemContent.ITEM_MAP.get(getArguments()的getString(
                    ARG_ITEM_ID));
        }
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_item_detail,
                集装箱,FALSE);        的LinearLayout =(的LinearLayout)rootView.findViewById(R.id.fragment_item_detail_1);
        LinearLayout.LayoutParams PARAMS =新LinearLayout.LayoutParams(
                android.widget.LinearLayout.LayoutParams.FILL_PARENT,
                android.widget.LinearLayout.LayoutParams.WRAP_CONTENT);
        样品=新的TextView(getActivity());
        sample.setText(getResources()的getString(R.string.apps_titel));        btnLogin =新按钮(getActivity());
        btnLogin.setLayoutParams(PARAMS);
        btnLogin.setText(登录);
        linearLayout.addView(样品);
        linearLayout.addView(btnLogin);        btnLogin.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(查看rootView){
                吐司面包= Toast.makeText(getActivity(),注册,
                        Toast.LENGTH_SHORT);
                toast.show();                片段片段=新FragmentApps();
                FragmentTransaction交易= getChildFragmentManager()
                        .beginTransaction();                //如果(addToBack)
                transaction.addToBackStack(NULL);                transaction.replace(R.id.fragment_item_detail_1,片段).commit();
                //意图I =新意图(getActivity()
                // FragmentRegister.class);
                // startActivity(ⅰ);
                // getActivity()完成()。
            }
        });        返回rootView;
    }
}


解决方案

我发现我自己的答案是:

在MainActivity我添加引用

 私人无效setDetailFragment(字符串ID,INT fragmentToReplace,
        布尔addToBack){
        捆绑参数=新包();
        arguments.putString(ItemDetailFragment.ARG_ITEM_ID,身份证);        片段片段=新ItemDetailFragment();
        如果(id.equals(注册)){
            片段=新FragmentRegister();
        }否则如果(id.equals(仪表板)){
            片段=新FragmentDashboard();
        }
        fragment.setArguments(参数);        FragmentTransaction交易= getFragmentManager()
                .beginTransaction();
        transaction.addToBackStack(NULL);
        transaction.replace(fragmentToReplace,片段).commit();    }

在LoginFragment我添加此功能:

  @覆盖
     公共无效onAttach(活动活动){
        super.onAttach(活动);        如果(!(的instanceof回调活性)){
            抛出新IllegalStateException异常(
                    活动必须实现片段的回调。);
        }        mCallbacks =(回调)的活动;
     }

和按钮看起来是这样的:

  btnLogin.setOnClickListener(新View.OnClickListener(){        公共无效的onClick(查看视图){
            mCallbacks.onItemSelected(仪表板);
        }
    });

:)

I'm having a problem with opening another fragment from an existing fragment in a master detail view in Android. I've tried various solutions, but nothing helped. I have a listview as a menu, where I can click on different items. By clicking on them, the right fragment will be opened. In one special fragment, I want to implement a button which should replace the existing fragment with another one, but this doesn't work. I've added a toast to see if the onclick method works, it does work, just the fragment switch won't do his job. Can anyone please help me or give me any hints, I'm about to freak out soon! :D

private Button btnLogin;

btnLogin = new Button(getActivity());
btnLogin.setLayoutParams(params);
btnLogin.setText("Login");

btnLogin.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View rootView) {
            Toast toast = Toast.makeText(getActivity(), "register",
                    Toast.LENGTH_SHORT);
            toast.show();

            Fragment fragment = new FragmentApps();
            FragmentTransaction transaction = getFragmentManager()
                    .beginTransaction();

            // if(addToBack)
            transaction.addToBackStack(null);

            transaction.replace(R.id.fragment_item_detail_1, fragment).commit();
        }
    });

This is the error message I get:

12-03 11:30:06.839: E/AndroidRuntime(9464): FATAL EXCEPTION: main
12-03 11:30:06.839: E/AndroidRuntime(9464): Process: at.test.app, PID: 9464
12-03 11:30:06.839: E/AndroidRuntime(9464): java.lang.NullPointerException: Attempt to invoke         virtual method 'boolean android.os.Bundle.containsKey(java.lang.String)' on a null object reference
12-03 11:30:06.839: E/AndroidRuntime(9464):     at     at.test.app.apps.FragmentApps.onCreate(FragmentApps.java:49)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.Fragment.performCreate(Fragment.java:2031)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.BackStackRecord.run(BackStackRecord.java:833)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.os.Handler.handleCallback(Handler.java:739)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.os.Looper.loop(Looper.java:135)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at android.app.ActivityThread.main(ActivityThread.java:5221)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at java.lang.reflect.Method.invoke(Native Method)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at java.lang.reflect.Method.invoke(Method.java:372)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
12-03 11:30:06.839: E/AndroidRuntime(9464):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Thanks in advance for any help!

edit -> the whole code: package at.test.app.login;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


/**
 * A fragment representing a single Item detail screen. This fragment is either
 * contained in a {@link ItemListActivity} in two-pane mode (on tablets) or a
 * {@link ItemDetailActivity} on handsets.
 */
public class FragmentTest extends Fragment {

    private LinearLayout linearLayout;
    private TextView sample;
    private Button btnLogin;

    /**
     * The fragment argument representing the item ID that this fragment
     * represents.
     */
    public static final String ARG_ITEM_ID = "item_id";

    /**
     * The dummy content this fragment is presenting.
     */
    private ItemContent.Item mItem;

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public FragmentTest() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActivity().setTitle(getResources().getString(R.string.apps_titel));

        if (getArguments().containsKey(ARG_ITEM_ID)) {
            // Load the dummy content specified by the fragment
            // arguments. In a real-world scenario, use a Loader
            // to load content from a content provider.
            mItem = ItemContent.ITEM_MAP.get(getArguments().getString(
                    ARG_ITEM_ID));
        }
    }

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

        linearLayout = (LinearLayout) rootView.findViewById(R.id.fragment_item_detail_1);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                android.widget.LinearLayout.LayoutParams.FILL_PARENT,
                android.widget.LinearLayout.LayoutParams.WRAP_CONTENT);
        sample = new TextView(getActivity());
        sample.setText(getResources().getString(R.string.apps_titel));

        btnLogin = new Button(getActivity());
        btnLogin.setLayoutParams(params);
        btnLogin.setText("Login");


        linearLayout.addView(sample);
        linearLayout.addView(btnLogin);

        btnLogin.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View rootView) {
                Toast toast = Toast.makeText(getActivity(), "register",
                        Toast.LENGTH_SHORT);
                toast.show();

                Fragment fragment = new FragmentApps();
                FragmentTransaction transaction = getChildFragmentManager()
                        .beginTransaction();

                // if(addToBack)
                transaction.addToBackStack(null);

                transaction.replace(R.id.fragment_item_detail_1, fragment).commit();


                // Intent i = new Intent(getActivity(),
                // FragmentRegister.class);
                // startActivity(i);
                // getActivity().finish();
            }
        });

        return rootView;
    }
}

解决方案

i have found the answer on my own:

in the mainActivity i add a reference

    private void setDetailFragment(String id, int fragmentToReplace,
        boolean addToBack) {
        Bundle arguments = new Bundle();
        arguments.putString(ItemDetailFragment.ARG_ITEM_ID, id);

        Fragment fragment = new ItemDetailFragment();
        if (id.equals("register")){
            fragment = new FragmentRegister();
        } else if (id.equals("dashboard")){
            fragment = new FragmentDashboard();
        }
        fragment.setArguments(arguments);

        FragmentTransaction transaction = getFragmentManager()
                .beginTransaction();
        transaction.addToBackStack(null);
        transaction.replace(fragmentToReplace, fragment).commit();

    }

in the LoginFragment i add this function:

     @Override
     public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (!(activity instanceof Callbacks)) {
            throw new IllegalStateException(
                    "Activity must implement fragment's callbacks.");
        }

        mCallbacks = (Callbacks) activity;
     }

and the button looks like this:

    btnLogin.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            mCallbacks.onItemSelected("dashboard");
        }
    });

这篇关于打开片段在现有的片段(主详细设计)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆