2017-09-25 2 views
1

J'ai app appelant en utilisant Twilio api, et je suis en train de changer le statut TextView texte après le service établi, j'ai cherché beaucoup mais je n'ai pas trouvé de solution utile , je veux changer le texte du service ou du récepteur de diffusion. Mon code de service ci-dessous:Xamarin Android: Modifier le texte TextView UI du service ou du récepteur

[Service] 
    class CallService : IntentService 
    { 


     public static MonkeyPhone phone ; 

     protected override void OnHandleIntent(Intent intent) 
     { 
      throw new NotImplementedException(); 
     } 

     public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
     { 

      // countine 
      new Task(() => 
      { 
       phone = new MonkeyPhone(ApplicationContext); 


       View view = View.Inflate(ApplicationContext, Resource.Layout.Main, null); 
       TextView connectionStatus = view.FindViewById<TextView>(Resource.Id.connectionStatus); 
       connectionStatus.Text = "Connected .."; 

      }).Start(); 



      return StartCommandResult.Sticky; 
     } 


    } 

Le service fonctionne bien et le téléphone de connexion est bien établie, juste besoin de savoir comment pourrais-je modifier le texte textView

Attention: le textView est à l'intérieur fragment

Répondre

2

le service fonctionne bien et le téléphone se connecter est bien établie, juste besoin de savoir comment pourrais-je modifier le texte textView

Tout d'abord, vous devez implémenter cette fonctionnalité dans Receiver, pas dans Service.

Dans votre service, vous devriez être en mesure d'envoyer du texte par exemple comme ceci:

[Service] 
public class MyIntentService : IntentService 
{ 
    public MyIntentService() : base("MyIntentService") 
    { 
    } 

    protected override void OnHandleIntent(Intent intent) 
    { 
     //get data when service started. 
     var value = intent.GetStringExtra("ServiceInfo"); 

     //send data to activity 
     Intent myintent = new Intent("IntentServiceAndReceiver"); 
     myintent.PutExtra("NewInfo", "Connected...!"); 
     SendBroadcast(myintent); 
    } 
} 

et créez votre Receiver et MainActivity par exemple comme ceci:

public class MainActivity: Activité { récepteur privé MyReceiver;

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 

    receiver = new MyReceiver(this); 

    // Set our view from the "main" layout resource 
    SetContentView(Resource.Layout.Main); 

    //show fragment in framelayout container 
    FragmentTransaction ft = this.FragmentManager.BeginTransaction(); 
    var myfragment = new MyFragment(); 
    ft.Add(Resource.Id.container, myfragment).AddToBackStack(null).Commit(); 
} 

protected override void OnResume() 
{ 
    base.OnResume(); 
    RegisterReceiver(receiver, new IntentFilter("IntentServiceAndReceiver")); 
} 

protected override void OnPause() 
{ 
    UnregisterReceiver(receiver); 
    base.OnPause(); 
} 

    [BroadcastReceiver(Enabled = true, Exported = false)] 
    [IntentFilter(new[] { "IntentServiceAndReceiver" })] 

    public class MyReceiver : BroadcastReceiver 
    { 
     private Activity mactivity; 

     public MyReceiver() 
     { 
     } 

     public MyReceiver(Activity activity) 
     { 
      mactivity = activity; 
     } 

     public override void OnReceive(Context context, Intent intent) 
     { 
      var value = intent.GetStringExtra("NewInfo"); 

      //update textview in fragment 
      if (mactivity != null) 
      { 
       var myfragment = mactivity.FragmentManager.FindFragmentById<MyFragment>(Resource.Id.container); 
       myfragment.UpdateText(value); 
      } 
     } 
    } 
} 

J'ai placé un Button pour démarrer le service et un TextView pour afficher le texte dans la mise en page de Fragment et le code comme ceci:

public class MyFragment : Fragment 
{ 
    private TextView tv; 

    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 
     var view = inflater.Inflate(Resource.Layout.FLayout, container, false); 
     tv = view.FindViewById<TextView>(Resource.Id.tv); 
     var btn = view.FindViewById<Button>(Resource.Id.startS); 
     btn.Click += (sender, e) => 
     { 
      // This code might be called from within an Activity, for example in an event 
      // handler for a button click. 
      Intent myintent = new Intent(this.Context, typeof(MyIntentService)); 

      // This is just one example of passing some values to an IntentService via the Intent: 
      myintent.PutExtra("ServiceInfo", "This is the information!"); 

      this.Context.StartService(myintent); 
     }; 
     return view; 
    } 

    public void UpdateText(string text) 
    { 
     tv.Text = text; 
    } 
} 

Voici le résultat:

enter image description here

+0

merci beaucoup ça marche bien !! –