我创建了一个应用程序,我正在向我的活动发送广播,在这个广播中,我发送两个值,一个是类型,另一个是徽章,我在内部类中接收这些值,这是扩展BroadcastReceiver但是当我要在我的主类的TextView中设置这些值时,它没有设置这些值,我无法理解为什么会发生这种情况。
以下是我的主要活动,其中存在内部类,并且它正在扩展BroadcastReceiver: -
import java.util.List;
import android.widget.ScrollView;
import android.widget.ViewAnimator;
public class TabActivity extends Activity implements OnClickListener{
static String type;
static String badges;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
................
}
public static class TabBroadcast extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
SharedPreferences shrd = context.getSharedPreferences("Gallery", context.MODE_WORLD_READABLE);
type = shrd.getString("type", "null");
badges = shrd.getString("badge_count", "null");
badge_tips_text.setText(badge);
/*Editor edit = shrd.edit();
edit.remove("type");*/
Toast.makeText(context, "" + type + "\n" + badge_tips_text.getText().toString(), Toast.LENGTH_LONG).show();
}
}
}
我收到了这些值,但无法在TextView中设置它们,请回复任何帮助都会很明显。
谢谢
答案 0 :(得分:0)
TabBroadcast是Activity的内部类,然后尝试访问UI元素:
public class TabActivity extends Activity implements OnClickListener{
static String type;
static String badges;
public TextView badge_tips_text; //<<<< TextView declare here
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
................
//<<<< initilze TextView here after setContentView
}
public static class TabBroadcast extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(TabActivity.this.badge_tips_text !=null)
TabActivity.this.badge_tips_text.setText(badge);
// your code here ...
}
}
}
并确保在调用TextView.setText
之前已初始化TextView答案 1 :(得分:0)
您无法从静态内部类引用实例(非静态)TextView
。相反,传递构造函数所需的东西:
public static class TabBroadcast extends BroadcastReceiver{
private final TextView textview;
public TabBroadcast(TextView t){
this.textview = t;
}
@Override
public void onReceive(Context context, Intent intent) {
t.setText("works");
}
}
答案 2 :(得分:0)
这是因为广播接收器在不同的线程上运行。尝试使用从您的活动传递的处理程序:
创建广播课的地方使用:
new TabBroadcast(new Handler());
通过TabBroadcast构造函数传递处理程序,现在在TabBroadcast onReceive中,您可以执行以下操作:
handler.post(new Runnable() {
public void run() {
myTextview.setText("Text");
}
});
您需要将myTextview设置为最终