Android按钮无法点击

时间:2018-04-29 01:38:27

标签: java android android-fragments button

我正在创建一个应用程序,它使用顶部的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设置正确,按钮只是在一些基本层面上被打破。

情节已经变厚。在其他活动中使用完全相同的设置似乎使其工作正常......据我所知,没有任何变化。

无论如何,我决定只为此活动进行硬编码,以便我可以转到应用的其他部分。谢谢大家对此问题的考虑。如果我弄清楚发生了什么,我会再次发帖。

3 个答案:

答案 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;
    }
}