0

Je dois accéder à une toile que j'ai créée à partir d'une autre classe.Toile d'accès Android de classe différente

J'ai donc une classe qui s'étend LinearLayout arc de dessin.

Maintenant à partir de main activity J'ai besoin d'accéder à cette toile sur laquelle elle est dessinée et de la redessiner. Idéalement seulement quelques parties de celui-ci.

Voici quelques codes dépouillés pour principal.

ArchProgressBar.java (avec toile)

public class ArchProgressBar extends LinearLayout { 

    public ArchProgressBar(Context context, AttributeSet attrs) { 

    private void init(Context context) { 
     this.setWillNotDraw(false); 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.arch_progress_bar, this, true); 
     this.postInvalidate(); 
    } 

    static void drawMeCircle(int aka) { 

    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     int mPaintHex = 0xFFFFFFFF; 
     int mPaintColor = Color.argb(100, Color.red(mPaintHex), Color.green(mPaintHex), Color.blue(mPaintHex)); 

     float left = 295; 
     float top = 712; 
     float right = 788; 
     float bottom = 1208; 

     Paint mPaintBackground = new Paint(); 
     mPaintBackground.setAntiAlias(true); 
     mPaintBackground.setStyle(Paint.Style.STROKE); 
     mPaintBackground.setStrokeWidth(13); 
     mPaintBackground.setColor(mPaintColor); 

     RectF mRectF = new RectF(left, top, right, bottom); 

     // THIS IS BACKGROUND LINE! draw background line 
     canvas.drawArc(mRectF, START_ANGLE, ARCH_LENGTH, false, mPaintBackground); 

     int mHourHex = 0xFF00FF00; 
     int mHourColor = Color.argb(255, Color.red(mHourHex), Color.green(mHourHex), Color.blue(mHourHex)); 

     Paint mPaintHours = new Paint(); 
     mPaintHours.setAntiAlias(true); 
     mPaintHours.setStyle(Paint.Style.STROKE); 
     mPaintHours.setStrokeWidth(13); 
     mPaintHours.setColor(mHourColor); 

     RectF mRectH = new RectF(left, top, right, bottom); 

     // THIS IS HOUR LINE!draw hour line 
     Calendar hCal = Calendar.getInstance(); 
     int hHour = hCal.get(Calendar.HOUR); 
     if(hHour != 0) { 
      for(int i=0; i<hHour-1; i++){ 
       canvas.drawArc(mRectH, START_ANGLE + ARCH_LENGTH + (i*30) +2, ARCH_LENGTH, false, mPaintHours); 
      } 
     } 
    } 

HomeActivity.java activité principale pour l'application (étend Activity)

public class HomeActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     IntentFilter mIntentFilter = new IntentFilter(); 
     mIntentFilter.addAction(Intent.ACTION_TIME_TICK); 
     mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 
     mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED); 
     registerReceiver(m_timeChangedReceiver, mIntentFilter); 
    } 
    //clock thing start 
    private final BroadcastReceiver m_timeChangedReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 
       Calendar hCal = Calendar.getInstance(); 
       int hHour = hCal.get(Calendar.HOUR); 
       ArchProgressBar.drawMeCircle(1); 
     } 
    }; 

    public void showApps(View v){ 
     Intent i = new Intent(this, AppsListActivity.class); 
     startActivity(i); 
    } 
} 

maintenant Quand BroadcastRecieved est déclenchée, je veux accéder à la toile de ArchProgressBar, supprimer le hour line (ou toute chose si ce n'est pas possible de supprimer seulement cette partie) et redessiner quelque chose de nouveau dessus.

si vous êtes errant quoi avec drawMeCircle. C'est juste quelque chose que je jouais avec. inclus pour montrer comment je pense que cela doit fonctionner.

+1

Où inscrivez-vous le BroadcastReceiver? –

+0

@ Code-Apprentice J'ai mis à jour le code – CBeTJlu4ok

+1

Copie possible de [Comment mettre à jour l'interface utilisateur dans un BroadcastReceiver] (http://stackoverflow.com/questions/14643385/how-to-update-ui-in-a-broadcastreceiver) –

Répondre

1

Vous avez juste besoin de changer une certaine valeur dans votre objet de vue et appelez invalidate() pour obtenir ce dont vous avez besoin. Cela va redessiner la toile dès que possible. A propos de votre code, je vous suggère de le modifier de cette manière (supposons que votre vue a une id = @ + id/arch_progress_bar)

HomeActivity

private final BroadcastReceiver m_timeChangedReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     Calendar hCal = Calendar.getInstance(); 
     int hHour = hCal.get(Calendar.HOUR); 
     ArchProgressBar bar = (ArchProgressBar) findViewById(R.id.arch_progress_bar); 
     if (bar != null) { 
      bar.drawMeCircle(1); 
     } 
    } 
}; 

// remember to unregister the broadcast receiver in your onDestroy() 
// as further optimization, you can also move the findViewById inside your onCreate(), so you don't have to repeat it for every broadcast you get 

ArchProgressBar

pubic void drawMeCircle(int aka) { 
    // your business logic 
    invalidate(); 
} // Remove the static keyword, it's not necessary 

Dernière considération: vous devriez prendre soin de la récréation d'activité en raison de la rotation de l'affichage. Pour gérer ce cas, vous devez enregistrer la valeur obtenue du récepteur de diffusion (1 dans cet exemple?) Pendant le rappel d'activité onSaveInstanceState(), l'extraire via le groupe que vous obtenez comme paramètre onCreate et le définir à nouveau sur votre vue.

+0

sur la dernière partie, et si mon application ne tourne pas. pas de problème non? parce que je n'y ai pas beaucoup compris – CBeTJlu4ok