2017-01-05 9 views
1

Пожалуйста, помогите мне понять. Я создаю простое приложение WebView, использующее андроид-студию и использую метод переопределения onBackPressed(), чтобы просто вернуть функциональность, если кто-то коснется кнопки «Назад». К сожалению, мое приложение закрывается с ошибкой «Приложение перестало работать», в то время как андроидная студия также показывает некоторые ошибки во время выполнения. Мой код выглядит следующим образом: - Ни это работало:Понять onBackPressed метод с WebView в android

@Override 
public void onBackPressed() 
{ 
    if (view.canGoBack()) 
    { 
     view.goBack(); 
    } else 
    { 
     //otherwise exit my app 
     super.onBackPressed(); 
    } 
} 

Нор это работало:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
if (keyCode == KeyEvent.KEYCODE_BACK) { 
    view.goBack(); 
    return true; 
} 

return super.onKeyDown(keyCode, event); 
} 

Я не знаю, что это неправильно, пожалуйста, кто-то очистить мою точку зрения.

Обновление: Когда я запускаю свое приложение в эмуляторе, он отлично работает, но когда я нажимаю кнопку «Назад» на своем устройстве, он должен вернуться к предыдущей странице, а не останавливает работу с ошибкой в ​​устройстве. «К сожалению, appname остановился рабочие»и ошибки сообщения в андроиде студий являются следующим: -

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: pk.shippingexpress.shippingexpress, PID: 1996 
       java.lang.NullPointerException 
        at pk.shippingexpress.shippingexpress.MainActivity.onBackPressed(MainActivity.java:42) 
        at android.app.Activity.onKeyUp(Activity.java:2193) 
        at android.view.KeyEvent.dispatch(KeyEvent.java:2664) 
        at android.app.Activity.dispatchKeyEvent(Activity.java:2423) 
        at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:547) 
        at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59) 
        at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:319) 
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962) 
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852) 
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826) 
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399) 
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449) 
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418) 
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525) 
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426) 
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582) 
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399) 
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449) 
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418) 
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426) 
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399) 
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449) 
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418) 
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558) 
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718) 
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010) 
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704) 
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695) 
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987) 
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 
        at android.os.MessageQueue.nativePollOnce(Native Method) 
        at android.os.MessageQueue.next(MessageQueue.java:138) 
        at android.os.Looper.loop(Looper.java:123) 
        at android.app.ActivityThread.main(ActivityThread.java:5017) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
        at dalvik.system.NativeStart.main(Native Method) 

Полного код моего MainActivity.java выглядит следующим образом: -

package pk.shippingexpress.shippingexpress; 

import android.net.Uri; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.appindexing.Thing; 
import com.google.android.gms.common.api.GoogleApiClient; 

public class MainActivity extends AppCompatActivity { 

    public WebView view; 
    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    private GoogleApiClient client; 

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

     String url = "http://easyonlineconverter.com"; 
     WebView view = (WebView) this.findViewById(R.id.express); 
     view.getSettings().setJavaScriptEnabled(true); 
     view.loadUrl(url); 
     view.setWebViewClient(new WebViewClient()); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 
    @Override 
public void onBackPressed() 
{ 
    if (view.canGoBack()) 
    { 
     view.goBack(); 
    } else 

    { 
     //otherwise exit my app 
     super.onBackPressed(); 
    } 
} 


    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    public Action getIndexApiAction() { 
     Thing object = new Thing.Builder() 
       .setName("Main Page") // TODO: Define a title for the content shown. 
       // TODO: Make sure this auto-generated URL is correct. 
       .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
       .build(); 
     return new Action.Builder(Action.TYPE_VIEW) 
       .setObject(object) 
       .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
       .build(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client.connect(); 
     AppIndex.AppIndexApi.start(client, getIndexApiAction()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     AppIndex.AppIndexApi.end(client, getIndexApiAction()); 
     client.disconnect(); 
    } 
} 
+0

ошибка пожалуйста ... –

+0

пожалуйста show studio сообщение об ошибке. –

+0

Без ошибки вот что я могу сказать: Второй метод не имеет смысла, потому что это клавиатура, поэтому вы можете забыть об этом. В своем первом фрагменте кода убедитесь, что ваше представление не равно нулю. –

ответ

0

Сначала вы объявляете переменную класса:

public WebView view; 

Но потом инициализировать локальную переменную, которая ненамеренно теней переменной класса:

WebView view = (WebView) this.findViewById(R.id.express); 

Так что, когда вы дойдете до этой линии

if (view.canGoBack()) 

view - null.

Изменить другие линии

view = (WebView) this.findViewById(R.id.express); 

, чтобы получить нормальную работу.

+0

Спасибо Крису Ларсону, что ваш код работал на меня, я благодарю всех за то, что помог мне. Хотя я новичок, поэтому нахожу вещи сложными. В любом случае, спасибо всем. –

+0

Если этот ответ сработал для вас, пожалуйста, примите его как правильное. С уважением –

+0

kris larson, пожалуйста, дай мне немного времени «[email protected]», вы объяснили это очень четко. Я буду рад видеть вашу электронную почту. –

0
java.lang.NullPointerException 
        at pk.shippingexpress.shippingexpress.MainActivity.onBackPressed(MainActivity.java:42) 

Еще раз проверьте, что у вас есть в этой строке. Я использую точно такой же код и без проблем.

@Override 
public void onBackPressed() { 
    if (webView.canGoBack()) { 
     webView.goBack(); 
    } else { 
     super.onBackPressed(); 
    } 
}