在片段中启动 Activity [重复]
Posted
技术标签:
【中文标题】在片段中启动 Activity [重复]【英文标题】:Start Activity within a fragment [duplicate] 【发布时间】:2016-01-10 10:04:52 【问题描述】:当我单击 Tab1Discover 中的一个按钮时,我正在尝试启动一个新的 Tab1City 活动,这是一个片段。 我已经尝试了几个组合 if 参数,查看 ***,但它会不断编译并使应用程序在启动时崩溃,并带有:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”
在 Tab1Discover.onCreateView(Tab1Discover.java:32)
public class Tab1Discover extends Fragment
@InjectView(R.id.buttonLille)
Button _loginButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
_loginButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Start the Signup activity
Intent intent = new Intent(getActivity(), Tab1City.class);
startActivity(intent);
);
return inflater.inflate(R.layout.tab_1_disc1_main, container, false);
【问题讨论】:
【参考方案1】:编辑:
我注意到(感谢评论)您正在使用 RoboGuice。在quick search 之后,我发现该引用仅在onViewCreated
中可用,所以将您的代码移到那里:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
return inflater.inflate(R.layout.tab_1_disc1_main, container, false);
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
_loginButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Start the Signup activity
Intent intent = new Intent(getActivity(), Tab1City.class);
startActivity(intent);
);
【讨论】:
他的@InjectView (R.id.idhere) CLASS varname;
完全有效。如果他使用@InjectView
,他不应该在使用变量之前对xml进行膨胀吗?如果不是,那么可能只是 R.id.buttonLille
不存在。
@showp1984 感谢您的洞察力。我已经相应地更新了答案。
Android Studio 对我说类型不兼容,因为 _loginButton 是一个按钮,它发现 R.id.buttonLille 是一个视图
@AdrienChapelet 如果您要使用@InjectView
,您将需要 RoboGuice。见:github.com/roboguice/roboguice
@AdrienChapelet 如果你在谈论我的旧答案,你需要使用... = (Button) ...
【参考方案2】:
根据您对“@InjectView”的使用,我猜您使用的是 ButterKnife 6.0.x。
你错过了 ButterKnife 的一部分,你必须告诉它何时注入视图。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.tab_1_disc1_main, container, false);
ButterKnife.inject(this, rootView);
_loginButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Start the Signup activity
Intent intent = new Intent(getActivity(), Tab1City.class);
startActivity(intent);
);
return rootView;
使用此代码,您可以告诉 ButterKnife 在哪里可以找到视图,以便它可以设置绑定。从这里开始,你可以简单地添加所有你想要的@InjectView,它会自动处理绑定。
【讨论】:
【参考方案3】:非常感谢,现在可以了:
public class Tab1Discover extends Fragment
@InjectView(R.id.buttonLille)
Button _lilleButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.tab_1_disc1_main, container, false);
ButterKnife.inject(this, rootView);
_lilleButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Start the Signup activity
Intent intent = new Intent(getActivity(), Tab1City.class);
startActivity(intent);
);
return rootView;
【讨论】:
以上是关于在片段中启动 Activity [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始
java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android