2017-01-24 6 views
-2

verwenden Ich versuche, Imageview in einer Methode zu verwenden, die in meiner BroadCastReceiver-Klasse ist, aber es gibt mir Fehler "Kann FindViewbyid nicht auflösen", da ich FindViewbyId außerhalb Mainactivity nicht verwenden kann.Je Ideen, wie ich verwenden kann " findViewbyId "in dieser Methode" onButtonSingleOrDoubleClickOrHold ". Ich muss grundsätzlich die Farbe der Bildansicht ändern, wenn diese Methode aufgerufen wird.Wie findViewbyId in BroadcastReceiver Klasse

Unten ist meine BroadCastReceiver Klasse

public class MyBroadcastReceiver extends FlicBroadcastReceiver { 

@Override 
protected void onRequestAppCredentials(Context context) { 
    // Set app credentials 
} 

@Override 
public void onButtonSingleOrDoubleClickOrHold(Context context, FlicButton button, boolean wasQueued, int timeDiff, boolean isSingleClick, boolean isDoubleClick, boolean isHold) { 

    if(isSingleClick) { 
     ImageView blueImage = (ImageView) findViewById(R.id.imageView); 
     blueImage.setColorFilter(0xff000000); 
     } 

Und meine Hauptaktivität

public class MainActivity extends AppCompatActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    try { 
     FlicManager.getInstance(this, new FlicManagerInitializedCallback() { 
      @Override 
      public void onInitialized(FlicManager manager) { 
       manager.initiateGrabButton(MainActivity.this); 
      } 
     }); 
    } catch (FlicAppNotInstalledException err) { 
     Toast.makeText(this, "Flic App is not installed", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() { 
    @Override 
    public void onInitialized(FlicManager manager) { 
     FlicButton button = manager.completeGrabButton(requestCode, resultCode, data); 
       if (button != null) { 
        button.registerListenForBroadcast(FlicBroadcastReceiverFlags.CLICK_OR_DOUBLE_CLICK_OR_HOLD); 
        Toast.makeText(MainActivity.this, "Grabbed a button", Toast.LENGTH_SHORT).show(); 

       } else { 
        Toast.makeText(MainActivity.this, "Did not grab any button", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
+1

Wie oft zugreifen können direkt Sie die gleiche Frage würde vorschlagen? Es ist 3.. – Selvin

Antwort

-1

Sie eine Entscheidung treffen, könnten ein statisches Activity Objekt in Ihrem MainActivity zu machen, und es aus den BroadcastReceiver nennen. Es ist keine gute Übung, da es Speicherlecks verursachen kann. Allerdings, wenn Sie möchten, um Ihre Methode in Ihrem BroadcastReceiver wirklich:

public class MainActivity extends AppCompatActivity { 

    public static MainActivity instance = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     this.instance = this; 
    } 
} 

Und dann rufen:

ImageView blueImage = (ImageView) MainActivity.instance.findViewById(R.id.imageView); 

Ich schlage vor, Sie über Ihr Code-Design zu überdenken, und vielleicht die Farbwechsel-Funktion bewegen, um Ihr Aktivität und rufen Sie diese Methode vom BroadcastReceiver auf.

+1

Ich kann die Parameter nicht ändern, da diese Methode von einer anderen Bibliothek stammt, die ich in dieses Projekt importiert habe – abdullah

+0

Guter Job, der meine Antwort kopiert! – C0D3LIC1OU5

+0

@abdullah Überprüfen Sie die neue –

1

können Sie versuchen, Aktivität manuell in Ihrem onButtonSingleOrDoubleClickOrHold Casting Kontext:

if(context == null || !(context instanceof MainActivity)) 
    return; 

AppCompatActivity yourActivity = (AppCompatActivity) context; 
ImageView blueImage = (ImageView) yourActivity.findViewById(R.id.imageView); 
+1

Dies stürzt meine App Fehler msg (Receiver konnte nicht gestartet werden com.example.abdullah.myapplication.MyBroadcastReceiver: java.lang.ClassCastException: android.app.ReceiverRestrictedContext kann nicht in android.app.Activity umgewandelt werden) – abdullah

0

Sie können einen Verweis auf Ihre ImageView oder zu Ihrem Activity in Ihre MyBroadcastReceiver. Sie können es setzen, wenn Sie Ihre MyBroadcastReceiver instanziieren, was Sie dem Konstruktor benötigen, also, wenn Sie auf etwas handeln müssen, haben Sie es bereits in Ihrem MyBroadcastReceiver.

Sie entscheiden können, ob eine Activity passieren und dann ImageView aufzublasen oder direkt Ihre ImageView passieren.

Ein weiterer Ansatz ist Ihre MyBroadcastReceiver als eine Aktivität der inneren oder anonymen Klasse zu erklären, so dass Sie Ihre Haupttätigkeit der Variablen

Verwandte Themen