fellow noob here having problems with my first app. What i am trying to achieve is to have Edit Text in the Action Bar which would accept and user typed URL and load it in the webview preferably without a go button and on keyboard enter only, but cant get it to work either way. The app is supposed to work like a browser. I have tried many things and nothing seems to work even assigned a button and app crashes. Have been trying to figure it out for the last 62hrs...:( Would really appreciate some help and any way i can go about making this work.
Here is the code:
MainActivity
package com.example.------------;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.SearchManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.CookieManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.Toast;
public class MainActivity extends Activity
implements NavigationDrawerFragment.NavigationDrawerCallbacks{
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
private WebView webView;
private EditText field;
private ProgressBar progress;
private InputMethodManager mIMEMgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
| ActionBar.DISPLAY_SHOW_HOME);
// add the custom view to the action bar
actionBar.setCustomView(R.layout.actionbar_view);
field = (EditText)findViewById(R.id.urlField);
webView = (WebView)findViewById(R.id.webView1);
webView.setWebChromeClient(new MyWebViewClient());
Button openUrl = (Button) findViewById(R.id.button1);
openUrl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String url = field.getText().toString();
String prefix = "https://www.google.com/search?q=";
if(!url.startsWith("http://") && !url.startsWith("https://") && !url.endsWith(".com"))
{
url = prefix + url;
}
if(url.endsWith(".com") || url.endsWith(".as") || url.endsWith(".uk") || url.endsWith(".biz"))
{
if(!url.startsWith("http://") && !url.startsWith("https://"))
{
url = "http://" + url;
}
}
if (validateUrl(url)) {
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
MainActivity.this.progress.setProgress(0);
}
}
private boolean validateUrl(String url) {
return true;
}
});
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setTitle(mTitle);
}
private class MyWebViewClient extends WebChromeClient {
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView View, String url)
{
webView.loadUrl(url);
return true;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack())
{
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
protected boolean validateUrl(String url) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}
activity_main
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.--------------.MainActivity" >
<!--
As the main content view, the view below consumes the entire
space available using match_parent in both dimensions.
-->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/button1"
android:onClick="onClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Go" />
</FrameLayout>
<!--
android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead.
-->
<!--
The drawer is given a fixed width in dp and extends the full height of
the container.
-->
<fragment
android:id="@+id/navigation_drawer"
android:name="com.example.minimalbrowserx.NavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
actionbar_view
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/urlField"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:imeOptions="actionDone"
android:inputType="textFilter"
android:text="no" >
</EditText>
Android Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.------------"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
LogCat
03-25 18:52:13.301: D/AndroidRuntime(10241): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
03-25 18:52:13.311: D/AndroidRuntime(10241): CheckJNI is ON
03-25 18:52:13.411: D/dalvikvm(10241): Trying to load lib libjavacore.so 0x0
03-25 18:52:13.421: D/dalvikvm(10241): Added shared lib libjavacore.so 0x0
03-25 18:52:13.441: D/dalvikvm(10241): Trying to load lib libnativehelper.so 0x0
03-25 18:52:13.441: D/dalvikvm(10241): Added shared lib libnativehelper.so 0x0
03-25 18:52:13.441: D/dalvikvm(10241): No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
03-25 18:52:13.711: D/dalvikvm(10241): Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) methods
03-25 18:52:14.381: E/memtrack(10241): Couldn't load memtrack module (No such file or directory)
03-25 18:52:14.381: E/android.os.Debug(10241): failed to load memtrack module: -2
03-25 18:52:14.781: D/AndroidRuntime(10241): Calling main entry com.android.commands.pm.Pm
03-25 18:52:14.831: D/AndroidRuntime(10241): Shutting down VM
03-25 18:52:14.831: D/dalvikvm(10241): Debugger has detached; object registry had 1 entries
03-25 18:52:15.631: D/AndroidRuntime(10252): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
03-25 18:52:15.641: D/AndroidRuntime(10252): CheckJNI is ON
03-25 18:52:15.741: D/dalvikvm(10252): Trying to load lib libjavacore.so 0x0
03-25 18:52:15.751: D/dalvikvm(10252): Added shared lib libjavacore.so 0x0
03-25 18:52:15.771: D/dalvikvm(10252): Trying to load lib libnativehelper.so 0x0
03-25 18:52:15.771: D/dalvikvm(10252): Added shared lib libnativehelper.so 0x0
03-25 18:52:15.781: D/dalvikvm(10252): No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
03-25 18:52:16.031: D/dalvikvm(10252): Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) methods
03-25 18:52:16.721: E/memtrack(10252): Couldn't load memtrack module (No such file or directory)
03-25 18:52:16.721: E/android.os.Debug(10252): failed to load memtrack module: -2
03-25 18:52:17.191: D/AndroidRuntime(10252): Calling main entry com.android.commands.am.Am
03-25 18:52:17.271: I/ActivityManager(385): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.minimalbrowserx/.MainActivity} from pid 10252
03-25 18:52:17.281: D/AndroidRuntime(10252): Shutting down VM
03-25 18:52:17.291: D/jdwp(10252): Got wake-up signal, bailing out of select
03-25 18:52:17.291: D/dalvikvm(10252): Debugger has detached; object registry had 1 entries
03-25 18:52:25.101: W/AwContents(10213): nativeOnDraw failed; clearing to background color.
03-25 18:52:25.161: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.161: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.161: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.161: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/KeypressStandard.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressStandard.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/KeypressSpacebar.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressSpacebar.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/KeypressDelete.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressDelete.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/KeypressReturn.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressReturn.ogg
03-25 18:52:25.171: E/SoundPool(385): error loading /system/media/audio/ui/KeypressInvalid.ogg
03-25 18:52:25.171: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressInvalid.ogg
03-25 18:52:25.171: W/AudioService(385): onLoadSoundEffects(), Error -1 while loading samples
03-25 18:52:25.361: D/AndroidRuntime(10213): Shutting down VM
03-25 18:52:25.361: W/dalvikvm(10213): threadid=1: thread exiting with uncaught exception (group=0xb3acbba8)
03-25 18:52:25.381: E/AndroidRuntime(10213): FATAL EXCEPTION: main
03-25 18:52:25.381: E/AndroidRuntime(10213): Process: com.example.minimalbrowserx, PID: 10213
03-25 18:52:25.381: E/AndroidRuntime(10213): java.lang.NullPointerException
03-25 18:52:25.381: E/AndroidRuntime(10213): at com.example.minimalbrowserx.MainActivity$1.onClick(MainActivity.java:105)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.view.View.performClick(View.java:4438)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.view.View$PerformClick.run(View.java:18422)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.os.Handler.handleCallback(Handler.java:733)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.os.Handler.dispatchMessage(Handler.java:95)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.os.Looper.loop(Looper.java:136)
03-25 18:52:25.381: E/AndroidRuntime(10213): at android.app.ActivityThread.main(ActivityThread.java:5017)
03-25 18:52:25.381: E/AndroidRuntime(10213): at java.lang.reflect.Method.invokeNative(Native Method)
03-25 18:52:25.381: E/AndroidRuntime(10213): at java.lang.reflect.Method.invoke(Method.java:515)
03-25 18:52:25.381: E/AndroidRuntime(10213): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-25 18:52:25.381: E/AndroidRuntime(10213): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-25 18:52:25.381: E/AndroidRuntime(10213): at dalvik.system.NativeStart.main(Native Method)
03-25 18:52:25.401: W/ActivityManager(385): Force finishing activity com.example.minimalbrowserx/.MainActivity
03-25 18:52:25.421: D/gralloc(54): Registering a buffer in the process that created it. This may cause memory ordering problems.
03-25 18:52:25.421: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.421: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.431: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.431: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.431: E/SurfaceFlinger(54): glCheckFramebufferStatusOES error 2139965326
03-25 18:52:25.431: E/SurfaceFlinger(54): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot
03-25 18:52:25.441: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.441: E/libEGL(54): called unimplemented OpenGL ES API
03-25 18:52:25.441: W/WindowManager(385): Screenshot failure taking screenshot for (246x410) to layer 21010
03-25 18:52:25.731: I/Choreographer(385): Skipped 37 frames! The application may be doing too much work on its main thread.
03-25 18:52:26.241: W/ActivityManager(385): Activity pause timeout for ActivityRecord{b3dbeaa0 u0 com.example.minimalbrowserx/.MainActivity t135 f}
03-25 18:52:26.391: I/Choreographer(540): Skipped 32 frames! The application may be doing too much work on its main thread.
03-25 18:52:28.141: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.141: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.141: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/KeypressStandard.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressStandard.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/KeypressSpacebar.ogg
03-25 18:52:28.151: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressSpacebar.ogg
03-25 18:52:28.151: E/SoundPool(385): error loading /system/media/audio/ui/KeypressDelete.ogg
03-25 18:52:28.161: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressDelete.ogg
03-25 18:52:28.161: E/SoundPool(385): error loading /system/media/audio/ui/KeypressReturn.ogg
03-25 18:52:28.161: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressReturn.ogg
03-25 18:52:28.161: E/SoundPool(385): error loading /system/media/audio/ui/KeypressInvalid.ogg
03-25 18:52:28.161: W/AudioService(385): Soundpool could not load file: /system/media/audio/ui/KeypressInvalid.ogg
03-25 18:52:28.161: W/AudioService(385): onLoadSoundEffects(), Error -1 while loading samples
03-25 18:52:28.231: I/Process(10213): Sending signal. PID: 10213 SIG: 9
03-25 18:52:28.311: I/ActivityManager(385): Process com.example.minimalbrowserx (pid 10213) has died.
03-25 18:52:28.371: W/InputDispatcher(385): channel 'b4213d88 com.example.minimalbrowserx/com.example.minimalbrowserx.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
03-25 18:52:28.371: E/InputDispatcher(385): channel 'b4213d88 com.example.minimalbrowserx/com.example.minimalbrowserx.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
03-25 18:52:28.411: W/InputDispatcher(385): Attempted to unregister already unregistered input channel 'b4213d88 com.example.minimalbrowserx/com.example.minimalbrowserx.MainActivity (server)'
03-25 18:52:28.411: I/WindowState(385): WIN DEATH: Window{b4213d88 u0 com.example.minimalbrowserx/com.example.minimalbrowserx.MainActivity}
03-25 18:52:28.421: I/Choreographer(385): Skipped 34 frames! The application may be doing too much work on its main thread.
03-25 18:52:28.501: I/Choreographer(385): Skipped 95 frames! The application may be doing too much work on its main thread.
03-25 18:52:28.591: W/InputMethodManagerService(385): Got RemoteException sending setActive(false) notification to pid 10213 uid 10052
03-25 18:52:28.601: W/Binder(503): Caught a RuntimeException from the binder stub implementation.
03-25 18:52:28.601: W/Binder(503): java.lang.NullPointerException
03-25 18:52:28.601: W/Binder(503): at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)
03-25 18:52:28.601: W/Binder(503): at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129)
03-25 18:52:28.601: W/Binder(503): at android.os.Binder.execTransact(Binder.java:404)
03-25 18:52:28.601: W/Binder(503): at dalvik.system.NativeStart.run(Native Method)
03-25 18:52:28.691: I/Choreographer(385): Skipped 41 frames! The application may be doing too much work on its main thread.
03-25 18:53:21.601: D/LightsService(385): Excessive delay setting light: 155ms
03-25 19:03:19.131: D/ConnectivityService(385): Sampling interval elapsed, updating statistics ..
03-25 19:03:19.181: D/ConnectivityService(385): Done.
03-25 19:03:19.181: D/ConnectivityService(385): Setting timer for 720seconds
03-25 19:04:19.181: I/ProcessStatsService(385): Prepared write state in 5ms
03-25 19:04:19.191: I/ProcessStatsService(385): Prepared write state in 10ms
According to your logcat it seems that you are calling progress.setProgress(0)
(line 105) but you haven't instantiated the progress
ProgressBar
(therefore its value is null
). This causes a java.lang.NullPointerException
. Instantiate the progress
ProgressBar
before calling the setProgress(0)
on it.