【问题标题】:Cant use onClick in another class,不能在另一个类中使用 onClick,
【发布时间】:2018-01-06 15:17:48
【问题描述】:

我正在尝试将 options_menu 的 onClickListener 实现到另一个类,但我无法弄清楚如何做到这一点,目前代码中有两个我无法弄清楚的错误。第一个是

public class OptionsMenu  implements View.OnClickListener{

第二个是

PopupMenu popup = new PopupMenu(OptionsMenu.this, options_menu);

我试图四处搜索有关此问题的修复程序,但我找不到一个或任何与那里的代码有类似问题的人。我要做的就是清理 Home.Java,这样那里的代码就更少了。这也是我第一次尝试使用另一个课程,所以如果我能通过这个课程会有很大帮助,这样我就可以开始一个新课程了?

Home.Java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.EditorInfo;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

public class Home extends AppCompatActivity {

private ImageButton options_menu;
private WebView webView;
private EditText search_bar;
private int on = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    webView = (WebView)findViewById(R.id.webView);
    options_menu.findViewById(R.id.options_menu);

    //Open in Equinox instead of Deafult Browser
    webView.setWebViewClient(new
            WebViewClient());

    //WebView - JavaScript-WebViewSettings-HomePage
    final WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.getSettings().setSupportZoom(true);
    webView.loadUrl("https://www.Google.ca");



    //options button toolbar
    options_menu = (ImageButton) findViewById(R.id.options_menu);
    options_menu.findViewById(R.id.options_menu);
    options_menu.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            PopupMenu popup = new PopupMenu(Home.this, options_menu);

            popup.getMenuInflater().inflate(R.menu.popup_menu,         popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

                public boolean onMenuItemClick(MenuItem item) {

                    switch (item.getItemId()) {

                        case R.id.back:
                            if (webView.canGoBack()) {

                                webView.goBack();
                            }
                            else {
                                webView.reload();
                            }
                            return true;
                        case R.id.forward:
                            if (webView.canGoForward()) {

                                webView.goForward();
                            }
                            else {
                                webView.reload();
                            }
                            return true;
                        case R.id.refresh:
                            webView.reload();
                        default:
                            return false;
                    }
                }
            });
            popup.show();
        }
    });

    // settings for keyboard
    search_bar = (EditText)findViewById(R.id.search_bar);
    search_bar.setOnEditorActionListener(new OnEditorActionListener(){
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            if(arg1 == EditorInfo.IME_ACTION_GO)
            {
                if (search_bar.getText().toString().contains(".com")) {
                    webView.loadUrl("https://".concat(search_bar.getText().toString()));
                } else {
                    webView.loadUrl("https://www.google.ca/search?q=".concat(search_bar.getText().toString()));
                }
            }
            return false;
        }
    });
    search_bar.requestFocus();
    search_bar.setFocusableInTouchMode(true);

}

// Animation of search_bar
public void edit_clicked(View view) {


    EditText search_bar = (EditText) findViewById(R.id.search_bar);

    Animation anim = AnimationUtils.loadAnimation(Home.this, R.anim.edittext_scale);
    search_bar.startAnimation(anim);

}
//Hard Back Button
public void onBackPressed(){
    if (webView.canGoBack()){
        webView.goBack();
    }
    else{
        webView.reload();
    }
}
}

OptionsMenu.Java

import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.PopupMenu;


/**
 * Created on 2018-01-05.
 */

public class OptionsMenu  implements View.OnClickListener{

public ImageButton options_menu;
public WebView webView;


public void onclick (View view){
             options_menu.findViewById(R.id.options_menu);
             options_menu.setOnClickListener(new OnClickListener() {


        public void onClick (View view){

            PopupMenu popup = new PopupMenu(OptionsMenu.this,   options_menu);

            popup.getMenuInflater().inflate(R.menu.popup_menu,   popup.getMenu());
            popup.setOnMenuItemClickListener(new   PopupMenu.OnMenuItemClickListener() {

                public boolean onMenuItemClick(MenuItem item) {

                    switch (item.getItemId()) {

                        case R.id.back:
                            if (webView.canGoBack()) {

                                webView.goBack();
                            }
                            else {
                                webView.reload();
                            }
                            return true;
                        case R.id.forward:
                            if (webView.canGoForward()) {

                                webView.goForward();
                            }
                            else {
                                webView.reload();
                            }
                            return true;
                        case R.id.refresh:
                            webView.reload();
                        default:
                            return false;
                    }
                }
            });
            popup.show();
        }
    });
}

}

【问题讨论】:

  • PopupMenu popup = new PopupMenu(OptionsMenu.this, options_menu);您应该将活动上下文作为 Popmenu 的第一个参数而不是 Optionmenu.class 传递,后者只是一个类。所以应该是 PopupMenu popup = new PopupMenu(activty, options_menu);
  • 活动导致它仍然有错误
  • 你如何通过活动?
  • 老实说,这就是为什么我需要课程帮助,因为我不知道......
  • 在活动 OptionsMenu optionsMenu = OptionsMenu(activity.this, options_menu, webview) 中创建如下选项菜单

标签: java android class onclick listener


【解决方案1】:

我无法确定您的问题是什么,但我在您的示例中发现了一些问题。

第一个:
PopupMenu 需要 2 个主要对象,第一个是 Context,您可以使用 Activity 本身,第二个是应该附加 PopupMenu 的锚视图。

/* Main.this refers to the current `Main` activity object
 and should be called from within the activity */
PopupMenu popupMenu = new PopupMenu(Main.this, imageButton); 

第二:
您已经创建了一个 OptionsMenu 类,并且您尝试从您的 xml 布局中进行扩充。只有 View 或扩展 View 的对象可以从 xml 膨胀 (findViewById()) 并且您的 OptionsMenu 不是 View

因此,这里有一个简单的示例,说明如何从 xml 扩展视图并将PopupMenu 附件移交给不同的类。

将 PopupMenu 附加到视图的类:

public class OptionsMenuHandler{
    public OptionsMenuHandler(Context context, View anchorView) {
        PopupMenu popupMenu = new PopupMenu(context, anchorView);

        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return false;
            }
        });
    }
}

还有活动:

public class TestActivity extends AppCompatActivity {

    ImageButton menuButton;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.crop_image_view);

        menuButton = findViewById(R.id.menuButton);

        new OptionsMenuHandler(TestActivity.this, menuButton);
    }
}

记住这只是为了教你如何使用类。

【讨论】:

  • 如果有网站/链接或页面可以帮助我更多的课程,非常感谢
  • 网上资源很多。尝试谷歌搜索“java 类和对象”。
  • 现在没有错误但启动时崩溃,如果我使用 Main 那么它会出现错误。我扩展到 AppCompatActivity,我可以使用 OptionsMenu
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 2018-11-15
  • 2020-05-09
  • 1970-01-01
  • 2019-02-19
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多