2016-08-14 18 views
1

私はXamarinを使用してC#で書かれたAndroidアプリを持っています。私は、TextViewとバナー広告用のGoogle admod AdViewを含むLinearLayoutにアプリを縮小しました。アプリ再開時にソフトキーボードを隠す

ソフトキーボードがアプリに表示されないようにする必要はありません。アプリケーションを起動すると、TextViewとバナーの追加が表示されます。別のアプリに切り替えた後、最初のアプリに切り替えると、最初のアプリが再開するとすぐにソフトキーボードがポップアップします。これは、AdViewが存在する場合にのみ発生します。アプリからAdViewを削除すると、ソフトキーボードがポップアップしません。

アプリが最初に起動され、AdViewが存在するときにキーボードがポップアップされません - アプリが一時停止され再開した場合のみです。私はAdViewが含まれている場合

protected override void OnResume() 
{ 
    base.OnResume(); 
    InputMethodManager im = (InputMethodManager)GetSystemService(Context.InputMethodService); 
    im.HideSoftInputFromWindow(Window.DecorView.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 
}         

が、キーボードはまだ履歴書にポップアップ表示:

は、私は次のOnResumeオーバーライドを持っています。

私は、具体的AdViewためOnResumeでキーボードを隠してみました:

im.HideSoftInputFromWindow(adView.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 

が、それはどちらかの助けにはなりませんでした。

私は多くの多くの他の多くのスタックオーバーフローの問題で見つけることができるすべての提案を試しました。私は、AdViewが存在するときにアプリが再開された場合を除いて、キーボードがポップアップするのを防ぐことができます。

私は困惑しています。何か案は?

詳細... ....

まず、修正。 TextViewではなく、LinearLayoutにEditTextがあります。私はソフトキーボードを欲しがっていませんが、EditTextを編集可能にしたいのです(アプリケーションのフルバージョンではEditTextのテキストを追加/削除/変更するためのボタンを用意しています)。

私は、EditTextとAdViewを含む1つのLinearLayourにアプリを縮小しました。 AdViewに広告を読み込んでアプリを実行した後、別のアプリに切り替えた後、切り替えて、ソフトキーボードがポップアップします。私はそれを望んでいない。ただし、AdViewに広告を読み込まない(ただしAxLmファイルにAdViewがある)場合は、実行して切り替えてください。ソフトキーボードが表示されません。

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="App1.App1" 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.ACCESS_NETWORK_STATE" /> 
    <application android:label="App1"> 
     <meta-data android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version" /> 
     <activity android:name="com.google.android.gms.ads.AdActivity" 
       android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
       android:theme="@android:style/Theme.Translucent" 
       android:windowSoftInputMode="stateAlwaysHidden" /> 
    </application> 
</manifest> 

Main.axml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/layout"> 

    <EditText xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/editText" /> 

    <com.google.android.gms.ads.AdView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/adView" 
    ads:adSize="SMART_BANNER" 
    ads:adUnitId="ca-app-pub-3940256099942544/6300978111"> 
    </com.google.android.gms.ads.AdView> 

</LinearLayout> 

MainActivity.cs:

using Android.App; 
using Android.Content; 
using Android.Views; 
using Android.Views.InputMethods; 
using Android.OS; 
using Android.Widget; 
using Android.Gms.Ads; 

namespace App1 
{ 
    [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Main); 

      AdView adView = FindViewById<AdView>(Resource.Id.adView); 
      var requestbuilder = new AdRequest.Builder(); 
      adView.LoadAd(requestbuilder.Build()); 
     } 


     protected override void OnResume() 
     { 
      base.OnResume(); 

      InputMethodManager im = (InputMethodManager)GetSystemService(Context.InputMethodService); 

      im.HideSoftInputFromWindow(Window.DecorView.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 

      LinearLayout layout = FindViewById<LinearLayout>(Resource.Id.layout); 
      im.HideSoftInputFromWindow(layout.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 

      EditText editText = FindViewById<EditText>(Resource.Id.editText); 
      im.HideSoftInputFromWindow(editText.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 

      AdView adView = FindViewById<AdView>(Resource.Id.adView); 
      im.HideSoftInputFromWindow(adView.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None); 

     } 
    } 
} 

コードを上記のように、次のように

ソースであります私のプロを示す傷み。アプリを携帯電話にデプロイし、アプリを実行し、別のアプリに切り替えてからもう一度切り替えると、最初のアプリを再開するとソフトキーボードがポップアップします。しかし... MainActivity.csで次のコード行コメントアウト:

adView.LoadAd(requestbuilder.Build()); 

と展開を繰り返すなどして、ソフトキーボードがポップアップ表示されません。

私が言ったように、私は困惑しています。私はフォーカスを変更するためのハンドラをEditTextに追加してみましたが、EditTextがフォーカスを失ったときにのみ呼び出されます。

答えて

0

問題はEditTextです。アクティビティが作成されると自動フォーカスが得られます。このデフォルトの動作を削除するには、この2行をルート要素に追加します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/layout" 
    android:descendantFocusability="beforeDescendants" 
    android:focusableInTouchMode="true"> 
+0

これは機能します。ありがとうございました。もう1つの要件があります... editTextをタッチするとキーボードがポップアップしないようにしたいが、タッチイベントを処理したい。 editTextにテキストがあり、それを変更できるようにするために、カーソルがタッチに反応するようにしたいが、私はソフトキーボードではなく、編集に専用のボタンを使いたい。何か案は? – JeffR

+0

別の全く別の質問ありがとうございました。新しい質問をすることをお勧めします。私は助けてうれしいです。私の答えを正しいものとしてマークしてください。ありがとうございました。 – jzeferino

+0

ありがとうございます。答えとしてマーク。新しい質問はこちらhttp://stackoverflow.com/questions/38956548/hide-soft-keyboard-for-edittext-focus-touch – JeffR

関連する問題