无法在静态内部类中的TextView中设置文本

时间:2013-02-01 05:12:32

标签: android textview broadcastreceiver

我创建了一个应用程序,我正在向我的活动发送广播,在这个广播中,我发送两个值,一个是类型,另一个是徽章,我在内部类中接收这些值,这是扩展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中设置它们,请回复任何帮助都会很明显。

谢谢

3 个答案:

答案 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设置为最终