我正在创建一个应用程序,它使用顶部的Toolbar
fragment
和几个按钮。按钮以编程方式添加。
问题在于,当我启动应用程序时,会出现工具栏和按钮,但无法单击按钮。当按钮被鼠标悬停(我使用模拟器)或点击时,它们根本不会改变,并且不会通知我的OnClickListener
。但是,下面片段中的按钮和其他组件可以很好地工作。
工具栏的代码:
public class ToolbarFragment extends Fragment implements
View.OnClickListener{
public static final String LOG_KEY = "SM_TOOLBAR";
public static final String TO_ADD_FEED_KEY = "TO_ADD_FEED_KEY";
public static final String TO_ADD_PROFILE_KEY = "TO_ADD_PROFILE_KEY";
public static final String TO_ADD_FRIENDS_KEY = "TO_ADD_FRIENDS_KEY";
private Button feed;
private Button profile;
private Button friends;
private Button logout;
public ToolbarFragment() {
// Required empty public constructor
}
private Button addButton(int stringID, LinearLayout linearLayout) {
Button button = new Button(getContext());
button.setText(stringID);
button.setOnClickListener(this);
linearLayout.addView(button);
return button;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.fragment_toolbar, container, false);
Bundle arguments = getArguments();
if (arguments.getBoolean(TO_ADD_FEED_KEY)) {
Log.i(LOG_KEY, "Created feed key");
feed = addButton(R.string.feed, linearLayout);
}
if (arguments.getBoolean(TO_ADD_PROFILE_KEY)) {
Log.i(LOG_KEY, "Created profile Key");
profile = addButton(R.string.profile, linearLayout);
}
if (arguments.getBoolean(TO_ADD_FRIENDS_KEY)) {
Log.i(LOG_KEY, "Created friends key");
friends = addButton(R.string.friends, linearLayout);
}
logout = addButton(R.string.logout, linearLayout);
return linearLayout;
}
@Override
public void onClick(View view) {
Log.i(LOG_KEY, "A button was clicked.");
if (getActivity() instanceof IToolbarCallback) {
IToolbarCallback itc = (IToolbarCallback) getActivity();
if (view.equals(feed)) {
itc.feed();
}
if (view.equals(profile)) {
itc.profile();
}
if (view.equals(friends)) {
itc.friends();
}
if (view.equals(logout)) {
itc.logout();
}
}
}
}
除了回调之外,没有其他相关的代码 接口
public interface IToolbarCallback {
void feed();
void profile();
void logout();
void friends();
}
这仅用于让主机活动知道点击了什么。 最后,XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="project3.csc214.project23.Fragments.Toolbar.ToolbarFragment"
android:orientation="horizontal">
我使用片段的构建器,这里是代码:
public class ToolbarBuilder {
private boolean addFeed;
private boolean addProfile;
private boolean addFriends;
private FragmentManager fragmentManager;
private int addToID;
public ToolbarBuilder(FragmentManager fragmentManager, int addToID) {
this.fragmentManager = fragmentManager;
this.addToID = addToID;
addFeed = false;
addProfile = false;
addFriends = false;
}
public ToolbarBuilder addFeed() {
addFeed = true;
return this;
}
public ToolbarBuilder addProfile() {
addProfile = true;
return this;
}
public ToolbarBuilder addFriends() {
addFriends = true;
return this;
}
public void build() {
Bundle bundle = new Bundle();
bundle.putBoolean(ToolbarFragment.TO_ADD_FEED_KEY, addFeed);
bundle.putBoolean(ToolbarFragment.TO_ADD_FRIENDS_KEY, addFriends);
bundle.putBoolean(ToolbarFragment.TO_ADD_PROFILE_KEY, addProfile);
ToolbarFragment toolbarFragment = new ToolbarFragment();
toolbarFragment.setArguments(bundle);
fragmentManager.beginTransaction().add(addToID, toolbarFragment).commit();
}
}
只是为了澄清,据我所知,按钮没有接收任何输入。他们并没有打电话给onClick,他们根本没有做出任何反应。据我所知,onClick设置正确,按钮只是在一些基本层面上被打破。
情节已经变厚。在其他活动中使用完全相同的设置似乎使其工作正常......据我所知,没有任何变化。
无论如何,我决定只为此活动进行硬编码,以便我可以转到应用的其他部分。谢谢大家对此问题的考虑。如果我弄清楚发生了什么,我会再次发帖。
答案 0 :(得分:3)
不要比较视图以查看它们是否相等,比较ID。这里:
@Override
public void onClick(View view) {
Log.i(LOG_KEY, "A button was clicked.");
if (getActivity() instanceof IToolbarCallback) {
IToolbarCallback itc = (IToolbarCallback) getActivity();
if (view.equals(feed)) {
itc.feed();
}
if (view.equals(profile)) {
itc.profile();
}
if (view.equals(friends)) {
itc.friends();
}
if (view.equals(logout)) {
itc.logout();
}
}
}
应该是:
@Override
public void onClick(View view) {
Log.i(LOG_KEY, "A button was clicked.");
if (getActivity() instanceof IToolbarCallback) {
IToolbarCallback itc = (IToolbarCallback) getActivity();
if (view.getId() == feed.getId()) {
itc.feed();
}
if (view.getId() == profile.getId()) {
itc.profile();
}
if (view.getId() == friends.getId()) {
itc.friends();
}
if (view.getId() == logout.getId()) {
itc.logout();
}
}
}
此外,当您自己创建视图时,您还需要为它们提供ID。如果您使用的是API等级17+,则只需在视图上调用generateViewId()
,Android就会为您创建一个唯一的ID。
所以这样做:
private Button addButton(int stringID, LinearLayout linearLayout) {
Button button = new Button(getContext());
button.setText(stringID);
button.setOnClickListener(this);
linearLayout.addView(button);
button.generateViewId();
return button;
}
修改强> 除了我上面指定的内容之外,你的代码看起来很好。我要尝试的一件事是在addButton方法之外设置监听器:
private Button addButton(int stringID, LinearLayout linearLayout) {
Button button = new Button(getContext());
button.setText(stringID);
linearLayout.addView(button);
button.generateViewId();
return button;
}
if (arguments.getBoolean(TO_ADD_FEED_KEY)) {
Log.i(LOG_KEY, "Created feed key");
feed = addButton(R.string.feed, linearLayout);
feed.setOnClickListener(this);
}
if (arguments.getBoolean(TO_ADD_PROFILE_KEY)) {
Log.i(LOG_KEY, "Created profile Key");
profile = addButton(R.string.profile, linearLayout);
profile.setOnClickListener(this);
}
if (arguments.getBoolean(TO_ADD_FRIENDS_KEY)) {
Log.i(LOG_KEY, "Created friends key");
friends = addButton(R.string.friends, linearLayout);
friends.setOnClickListener(this);
}
logout = addButton(R.string.logout, linearLayout);
logout.setOnClickListener(this);
如果这不起作用,请尝试检查按钮顶部是否有任何其他视图拦截点击事件。
答案 1 :(得分:0)
这可能是因为您的活动主持人无法实施IToolbarCallback
。您需要使用以下内容进行检查:
@Override
public void onClick(View view) {
Log.i(LOG_KEY, "A button was clicked.");
if (getActivity() instanceof IToolbarCallback) {
Log.i(LOG_KEY, "IToolbarCallback is implemented.");
} else {
Log.e(LOG_KEY, "No IToolbarCallback implemented!!!");
}
}
答案 2 :(得分:0)
问题是你没有设置任何id
按钮。所以在这种情况下所有按钮都具有相同的ID。您必须明确地为每个按钮设置唯一ID。
private Button addButton(int stringID,int id, LinearLayout linearLayout) {
Button button = new Button(this);
button.setText(stringID);
button.setId(id);
button.setOnClickListener(this);
linearLayout.addView(button);
return button;
}
然后为每个按钮添加一个ID。请记住,ID应该是唯一的,并且必须是正int
。或者您可以直接使用view.generateViewId();
。
feed = addButton(R.string.feed,1, linearLayout);
profile = addButton(R.string.profile,2, linearLayout);
friends = addButton(R.string.friends,3, linearLayout);
logout = addButton(R.string.logout, 4,linearLayout);
然后按如下方式修改onClick()
@Override
public void onClick(View v) {
switch (v.getId()) {
case feed.getId():
itc.feed();
break;
case profile.getId():
itc.profile();
break;
case friends.getId():
itc.friends();
break;
case logout.getId():
itc.logout();
break;
default:
break;
}
}