Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在现有片段中打开片段(主细节设计)_Android_Android Fragments_Nullpointerexception_Master Detail_Oncreate - Fatal编程技术网

Android 在现有片段中打开片段(主细节设计)

Android 在现有片段中打开片段(主细节设计),android,android-fragments,nullpointerexception,master-detail,oncreate,Android,Android Fragments,Nullpointerexception,Master Detail,Oncreate,:) 我在Android主细节视图中打开现有片段的另一个片段时遇到问题。我尝试过各种各样的解决办法,但都无济于事。 我有一个列表视图作为菜单,在那里我可以点击不同的项目。单击它们,将打开正确的片段。在一个特殊的片段中,我想实现一个按钮,该按钮应该用另一个替换现有片段,但这不起作用。我添加了一个祝酒词,看看onclick方法是否有效,它是否有效,只是片段开关不起作用。谁能帮帮我或给我一些提示,我马上就要发疯了D private Button btnLogin; btnLogin = new Bu

:)

我在Android主细节视图中打开现有片段的另一个片段时遇到问题。我尝试过各种各样的解决办法,但都无济于事。 我有一个列表视图作为菜单,在那里我可以点击不同的项目。单击它们,将打开正确的片段。在一个特殊的片段中,我想实现一个按钮,该按钮应该用另一个替换现有片段,但这不起作用。我添加了一个祝酒词,看看onclick方法是否有效,它是否有效,只是片段开关不起作用。谁能帮帮我或给我一些提示,我马上就要发疯了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();
        }
    });
这是我收到的错误消息:

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)
提前感谢您的帮助

编辑->整个代码: 包位于.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;
    }
}

使用
getChildFragmentManager()
而不是
getFragmentManager

我自己找到了答案:

在main活动中,我添加了一个引用

    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();

    }
在LoginFragment中,我添加了以下函数:

     @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;
     }
按钮如下所示:

    btnLogin.setOnClickListener(new View.OnClickListener() {

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

您是否在任何地方使用了Bundle???是的,在创建(Bundle savedInstanceState)和@Override public View onCreateView(LayoutFlater充气机、视图组容器、Bundle savedInstanceState)时的公共无效中使用了Bundle,所以存在问题。。。显示itI的代码已编辑问题文本您是否已传递捆绑包中项目\u id的值???很简单,您的ARG_ITEM_ID为空。谢谢您的回答,但错误是相同的:(哦,很抱歉,我没有看到错误,哪一行是第49行?我已经编辑了问题文本,第49行是:@Override public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);