2017-01-16 2 views
0
ausgebessert

Ich habe einen Dienst, der eine Schaltfläche aus einer Layout-XML-Datei aufgeblasen hat. Ich versuche, der Schaltfläche einen Onclicklistener hinzuzufügen, aber aus irgendeinem Grund registrieren sich die Klicks nicht korrekt auf der Schaltfläche. Hier ist der Code für den Dienst, der die Layoutdatei aufbläst.OnClickListener funktioniert nicht für Layout in Service

public class OverlayServiceLayout extends Service implements View.OnClickListener 
{ 
    private WindowManager windowManager; 
    private LayoutInflater layoutInflater; 
    private RelativeLayout mTopView; 
    private Button myButton; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "onservicelayout creation", Toast.LENGTH_SHORT).show(); 
     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
       PixelFormat.TRANSLUCENT 
     ); 

     windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 

     layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     mTopView = (RelativeLayout) layoutInflater.inflate(R.layout.service_main, null); 

     windowManager.addView(mTopView, params); 
     myButton = (Button) mTopView.findViewById(R.id.button); 
     myButton.setText("Button's text was changed"); 
     myButton.setOnClickListener(this); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     //Toast.makeText(this, "on destroy was called", Toast.LENGTH_SHORT).show(); 
     if(mTopView != null) 
     { 
      //Toast.makeText(this, "button is not null", Toast.LENGTH_SHORT).show(); 
      try{ 
       windowManager.removeView(mTopView); 
      } 
      catch(Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
      mTopView = null; 
     } 
     else 
     { 
      Toast.makeText(this, "button is null", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onClick(View view) 
    { 
     Toast.makeText(this, "onclickregistered", Toast.LENGTH_SHORT).show(); 
     /* 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.putExtra("sms_body", "Hi"); 
     intent.putExtra(Intent.EXTRA_STREAM, R.drawable.smile); 
     intent.setType("image/png"); 
     startActivity(Intent.createChooser(intent, "Send")); 
     */ 
    } 
} 

Auch Hier ist die XML-Layout-Datei. Es ist nur ein relatives Layout mit einer Schaltfläche

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

    <Button 
     android:text="Button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/button" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="118dp" 
     android:layout_marginStart="118dp" 
     android:layout_marginTop="127dp" /> 
</RelativeLayout> 
+0

Was versuchen Sie hier zu erreichen? Was soll dieser Dienst tun? –

+0

Ich versuche, eine Schaltfläche zu erstellen, um der weichen Tastatur zusätzliche Funktionalität hinzuzufügen, ohne eine benutzerdefinierte, weiche Tastatur erstellen zu müssen. Irgendwann möchte ich die Schaltfläche erscheinen lassen, wenn die Soft-Tastatur geöffnet ist oder wenn eine SMS App geöffnet ist. Ich möchte, dass sich der Button direkt über der Soft-Tastatur befindet und wenn der Button angeklickt wird, werden Menüoptionen angezeigt. Sie können beispielsweise auf die Schaltfläche klicken, um voreingestellte Bilder durch Text zu senden. Der Grund, warum ich nicht nur eine benutzerdefinierte Soft-Tastatur erstellen möchte, ist, dass ich möchte, dass die Benutzer in der Lage sind, die von ihnen gewünschte Tastatur zu verwenden und trotzdem meine App verwenden können. –

Antwort

1

Sie können Ansichten in einem Dienst nicht aufblasen, da sie nie auf dem Bildschirm angezeigt werden. Wenn der Dienst eine Eingabe vom Benutzer benötigt, sollte er eine Aktivität starten, die dann UI-Elemente erstellen kann, mit denen der Benutzer interagieren kann.

+0

Es zeigt die Ansicht jedoch korrekt auf dem Bildschirm an. Der On-Click-Listener funktioniert einfach nicht richtig. Ich habe eine andere Version von diesem, wo ich manuell den Code für den Knopf in der Serviceklasse verursache, anstatt ein Layout aufzublasen, und alles funktioniert gut dafür einschließlich das onclicklistener. –

+0

@BrandonLavigne Anstatt Toasts zu Debuggingzwecken zu verwenden, empfehle ich 'Log.d()' zu verwenden. Toasts können übereinander erscheinen, so dass Sie sie vermissen werden. –

+0

Ja, das sollte ich wahrscheinlich tun. Danke für den Tipp. –

Verwandte Themen