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