Как заставить кнопки отображаться над WebView

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

Вот мой xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:orientation="horizontal" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/menu_panel">


                    <ImageButton
                        android:id="@+id/bHomeMenu"
                        android:layout_margin="-8dip"
                        android:layout_width="65dp"
                        android:layout_height="90dp"
                        android:background="@drawable/menu_btn_hcu_light_blue"
                        android:src="@drawable/icon_menu_home"
                        android:adjustViewBounds="true"
                        android:scaleType="centerInside"
                        style="@style/ButtonText"
                        android:textSize="13sp"
                        android:text="Home" />

                    <ImageButton
                        android:id="@+id/bItsMe247Menu"
                        android:layout_toRightOf="@+id/bHomeMenu"
                        android:layout_margin="-8dip"
                        android:layout_width="65dp"
                        android:layout_height="90dp"
                        android:background="@drawable/menu_btn_selected_hcu_light_blue"
                        android:src="@drawable/icon_menu_login"
                        android:adjustViewBounds="true"
                        android:scaleType="centerInside"
                        style="@style/ButtonText"
                        android:textSize="13sp"
                        android:text="It'sMe" />

                    <ImageButton
                        android:id="@+id/bFindUsMenu"
                        android:layout_toRightOf="@+id/bItsMe247Menu"
                        android:layout_margin="-8dip"
                        android:layout_width="65dp"
                        android:layout_height="90dp"
                        android:background="@drawable/menu_btn_hcu_light_blue"
                        android:src="@drawable/icon_menu_find_us"
                        android:adjustViewBounds="true"
                        android:scaleType="centerInside"
                        style="@style/ButtonText"
                        android:textSize="13sp"
                        android:text="FindUs" />

                    <ImageButton
                        android:id="@+id/bEmailMenu"
                        android:layout_toRightOf="@+id/bFindUsMenu"
                        android:layout_margin="-8dip"
                        android:layout_width="65dp"
                        android:layout_height="90dp"
                        android:background="@drawable/menu_btn_hcu_light_blue"
                        android:src="@drawable/icon_menu_email"
                        android:adjustViewBounds="true"
                        android:scaleType="centerInside"
                        style="@style/ButtonText"
                        android:textSize="13sp"
                        android:text="Email" />

                    <ImageButton
                        android:id="@+id/bRatesMenu"
                        android:layout_toRightOf="@+id/bEmailMenu"
                        android:layout_margin="-8dip"
                        android:layout_width="65dp"
                        android:layout_height="90dp"
                        android:background="@drawable/menu_btn_hcu_light_blue"
                        android:src="@drawable/icon_menu_rates"
                        android:adjustViewBounds="true"
                        android:scaleType="centerInside"
                        style="@style/ButtonText"
                        android:textSize="13sp"
                        android:text="Rates" />




    </LinearLayout>


                        <WebView xmlns:android="http://schemas.android.com/apk/res/android"
                            android:id="@+id/wvItsMe"
                            android:layout_width="fill_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1" />


</LinearLayout>

EDIT: вот мой код Java и примечание под ним:

    package com.dummyapp.app;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

import com.dummyapp.app.SimpleGestureFilter.SimpleGestureListener;

public class ItsMe247 extends Activity implements SimpleGestureListener{

    private SimpleGestureFilter detector;

    private WebView itsMeLogin;

//  ImageButton menuHome, menuFindUs, menuEmail, menuRates;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.itsme247);

//      menuHome = (ImageButton)findViewById(R.id.bHomeMenu);
//      menuFindUs = (ImageButton)findViewById(R.id.bFindUsMenu);
//      menuEmail = (ImageButton)findViewById(R.id.bEmailMenu);
//      menuRates = (ImageButton)findViewById(R.id.bRatesMenu);



        detector = new SimpleGestureFilter(this,this);

        itsMeLogin = new WebView(this);

        Toast.makeText(this, "Just Swipe To Exit", Toast.LENGTH_LONG).show();


        itsMeLogin.getSettings().setJavaScriptEnabled(true); // JavaScript enabled

        getWindow().requestFeature(Window.FEATURE_PROGRESS); // Show progress bar of page loading

        final Activity itsMeActivity = this;


        itsMeLogin.setWebChromeClient(new WebChromeClient() {

            public void onProgressChanged(WebView view, int progress){

                // Activities and WebViews measure progress with different scales.
                // The progress meter will automatically disappear when we reach 100%
                itsMeActivity.setProgress(progress * 100);

            }

        });

        itsMeLogin.setWebViewClient(new WebViewClient(){

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){

                Toast.makeText(itsMeActivity, "Oh no! " + description, Toast.LENGTH_SHORT).show();

            }


        });

        itsMeLogin.loadUrl("http://www.google.com");
        setContentView(itsMeLogin);


//      itsMeLogin.setWebViewClient(new WebViewClient() {
//          @Override
//          public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
//              return super.shouldOverrideUrlLoading(view, url);
//          }
//      });



//******************* MENU BUTTONS START HERE ********************************************************//        

//      menuRates.setOnClickListener(new View.OnClickListener() {
//          
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              Intent ratesIntent = new Intent(ItsMe247.this, Rates.class);
//              ItsMe247.this.startActivity(ratesIntent);
//              
//          }
//          
//      });
//      
//      
//      menuFindUs.setOnClickListener(new View.OnClickListener() {
//          
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              Intent contactIntent = new Intent(ItsMe247.this, Contact.class);
//              ItsMe247.this.startActivity(contactIntent);
//              
//          }
//      });
//      
//      menuEmail.setOnClickListener(new View.OnClickListener() {
//          
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              Intent emailIntent = new Intent(ItsMe247.this, Email.class);
//              ItsMe247.this.startActivity(emailIntent);
//              
//
//          }
//      });
//      
//      menuHome.setOnClickListener(new View.OnClickListener() {
//          
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              Intent itsMeIntent = new Intent(ItsMe247.this, MainActivity.class);
//              ItsMe247.this.startActivity(itsMeIntent);
//          }
//      });


//***************************** MENU BUTTONS END HERE ********************************************************//


    }//end onCreate method


    @Override 
      public boolean dispatchTouchEvent(MotionEvent me){ 
        this.detector.onTouchEvent(me);
       return super.dispatchTouchEvent(me); 
      }


        public void onSwipe(int direction) {

                   switch (direction) {

                   case SimpleGestureFilter.SWIPE_RIGHT: 

                       Intent funIntent = new Intent(ItsMe247.this, MainActivity.class);
                       ItsMe247.this.startActivity(funIntent);
                       //ItsMe247.this.finish();

                       break;

                   case SimpleGestureFilter.SWIPE_LEFT:  

                       Intent funIntent2 = new Intent(ItsMe247.this, Contact.class);
                       ItsMe247.this.startActivity(funIntent2);
                       //ItsMe247.this.finish();

                       break;

                   case SimpleGestureFilter.SWIPE_DOWN:  

                       break;

                   case SimpleGestureFilter.SWIPE_UP:   

                       break;                                               
                   } 

        }//end onSwipe method

      public void onDoubleTap() {

      }


}

У меня есть все кнопки меню, закомментированные (кнопки, которые я пытаюсь отобразить над веб-просмотром), пока я, наконец, не заставлю их отображаться через xml. Однако всякий раз, когда я раскомментирую кнопки и их слушателей, приложение вылетает при попытке войти в это действие.


person LargeGlasses    schedule 13.10.2012    source источник
comment
Попробуйте использовать RelativeLayout в качестве родительского макета вместо LinearLayout   -  person Zombie    schedule 13.10.2012
comment
@BobbeHoddi этот подход на самом деле не сработал. Я пробовал много разных комбинаций, используя RelativeLayout с другими макетами, но они тоже не работали. Спасибо хоть!   -  person LargeGlasses    schedule 15.10.2012


Ответы (1)


Ваш код не использует ваш макет XML, вы создаете свой собственный WebView в коде и устанавливаете его как представление, поэтому он полностью обходит ваш XML.

Я предоставил здесь несколько изменений, которые должны заставить его работать. Обратите особое внимание на строку setContentView и следующую строку, это то, что использует макет XML. Возможно, вам потребуется изменить имя макета (R.layout.whatever) и идентификатор веб-просмотра (R.id.webview). Может быть несколько ошибок синтаксического анализа из-за того, что я разместил его здесь, возможно, пропустил закрывающую скобку. Я удалил большую часть вашего закомментированного кода, чтобы упростить его.

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView( R.layout.xmlLayout );

    itsMeLogin = (WebView)findViewById( R.id.webview );

    detector = new SimpleGestureFilter(this,this);

    Toast.makeText(this, "Just Swipe To Exit", Toast.LENGTH_LONG).show();


    itsMeLogin.getSettings().setJavaScriptEnabled(true); // JavaScript enabled

    getWindow().requestFeature(Window.FEATURE_PROGRESS); // Show progress bar of page loading

    final Activity itsMeActivity = this;


    itsMeLogin.setWebChromeClient(new WebChromeClient() {

        public void onProgressChanged(WebView view, int progress){

            // Activities and WebViews measure progress with different scales.
            // The progress meter will automatically disappear when we reach 100%
            itsMeActivity.setProgress(progress * 100);

        }

    });

    itsMeLogin.setWebViewClient(new WebViewClient(){

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){

            Toast.makeText(itsMeActivity, "Oh no! " + description, Toast.LENGTH_SHORT).show();

        }


    });

    itsMeLogin.loadUrl("http://www.google.com");
}

Вот мой XML-файл из аналогичного макета, хотя ваш, вероятно, будет работать с отредактированным кодом.

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:columnCount="3"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
>
<EditText
    android:ems="4"
    android:imeOptions="actionNext"
    android:inputType="number"
    android:layout_gravity="center_horizontal"
    android:maxLength="4"
    android:selectAllOnFocus="true"
/>
<EditText
    android:ems="4"
    android:imeOptions="actionDone"
    android:inputType="textCapCharacters|textNoSuggestions"
    android:layout_gravity="center_horizontal"
    android:maxLength="3"
    android:selectAllOnFocus="true"
/>
<Button android:id="@+id/submit"
/>
<WebView android:id="@+id/webview"
    android:layout_columnSpan="3"
    android:layout_gravity="fill"
    android:layout_height="0dp"
    android:layout_width="0dp"
/>
</GridLayout>
person Ralgha    schedule 13.10.2012
comment
Я все еще пробую ваше предложение, но пока оно не работает. Хотя мне пришлось добавить tools:ignore=NewApi, чтобы ошибка исчезла при попытке использовать GridLayout. Может, это как-то связано... - person LargeGlasses; 15.10.2012
comment
Если вы разрабатываете версию до уровня API 14, вам потребуется использовать библиотеку совместимости. См. этот вопрос, чтобы узнать, как это сделать. - person Ralgha; 15.10.2012
comment
Спасибо. Любое понимание того, как выполнить шаги 2 и 3 в принятом ответе по вашей ссылке? Я добавил проект GridLayout в eclipse, но как сделать проект библиотекой и добавить этот проект библиотеки в свой рабочий проект? - person LargeGlasses; 16.10.2012
comment
Этот вопрос должен помочь в этом. Предпоследний ответ самый лаконичный. - person Ralgha; 16.10.2012
comment
Хорошо, я приближаюсь. Консоль выдает мне эту ошибку: [2012-10-15 14:37:20 - android-support-v7-gridlayout] Невозможно разрешить цель «android-7», и у меня есть большой красный восклицательный знак рядом с проект библиотеки, который я импортировал, а также рядом с моим основным проектом. - person LargeGlasses; 16.10.2012
comment
Я думаю, вам нужно загрузить платформу Android 2.1 SDK в диспетчере SDK, чтобы исправить это. - person Ralgha; 16.10.2012
comment
Вот и убрали восклицательные знаки! Спасибо! Теперь я посмотрю, смогу ли я заставить GridLayout делать то, что мне нужно. Я дам Вам знать. О, и нужно ли мне что-то добавлять в свой манифест, чтобы использовать GridLayout? - person LargeGlasses; 16.10.2012
comment
Это все еще не работает. Я даже скопировал и вставил ваш код, чтобы посмотреть, будет ли он правильно отображаться при запуске в эмуляторе, но это не так. Для других вещей в моем приложении мне пришлось поместить ‹uses-sdk android:minSdkVersion=7 AND android:targetSdkVersion=15 /› в мой манифест, и из-за этого я должен поместить tools:ignore=NewApi в определение моего GridLayout в xml. Может в этом дело?? - person LargeGlasses; 16.10.2012
comment
Если вы скопируете/вставите мой код, вам придется изменить match_parent на fill_parent для более низких уровней API и добавить пространство имен библиотеки в GridLayout, хотя я не думаю, что он даже запустится без этого, так что, возможно, вы уже это сделали. Можете ли вы поместить код, который отображает макет в вопросе? - person Ralgha; 16.10.2012
comment
Подождите, мне тоже нужно что-то делать в java-коде, чтобы GridLayout работал? - person LargeGlasses; 16.10.2012
comment
Нет, я просто хочу посмотреть, происходит ли что-то в вашем коде, потому что, если бы вы просто скопировали мой XML, это должно было сработать. - person Ralgha; 16.10.2012
comment
Хорошо, я убедился, что все было так же, как ваши правки. Приложение запускается, но все равно вылетает при попытке войти в действие... Я действительно думал, что это решит эту проблему... :/ - person LargeGlasses; 16.10.2012
comment
Закомментируйте все, что находится между itsMeLogin = (WebView)findViewById( R.id.webview ); и itsMeLogin.loadUrl(google.com); Это должно запуститься и сообщить вам, работает ли макет. - person Ralgha; 16.10.2012
comment
Хорошо, это привело меня к действию с кнопками наверху, но оно сразу же отключилось от этого действия и само загрузило веб-просмотр. Похоже, мы почти у цели! - person LargeGlasses; 16.10.2012
comment
Это что-то в вашем коде делает это. Закомментируйте все, кроме super.onCreate(savedInstanceState); setContentView( R.layout.xmlLayout );, и вы увидите макет. Другая проблема не связана с вашим макетом. - person Ralgha; 16.10.2012
comment
getWindow().requestFeature(Window.FEATURE_PROGRESS) была причиной сбоя. Я дошел до того, что теперь он показывает мой макет, но примерно через 8 секунд он говорит, что веб-страница недоступна. Я заставил его остаться на своем макете, раскомментировав setWebViewclient, который содержит метод shouldOverrideUrlLoading. Я не уверен, почему он не загружает мой URL. - person LargeGlasses; 16.10.2012
comment
Эй, на самом деле это был просто мой эмулятор, который нужно было выключить и снова запустить! Теперь это работает! Я искал это решение в течение нескольких месяцев! Большое спасибо за помощь/решение!!! - person LargeGlasses; 16.10.2012