1

我创建了一个应用程序,在其中我向我的活动发送广播,在这个广播中我发送两个值,一个是类型,另一个是徽章,我在扩展 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 中设置它们,请回复任何帮助将是可观的。

谢谢

4

3 回答 3

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

于 2013-02-01T05:20:52.403 回答
0

发生这种情况是因为广播接收器在不同的线程上运行。尝试使用从您的活动传递的处理程序:

创建广播类的地方使用:

new TabBroadcast(new Handler());

通过 TabBroadcast 构造函数传递处理程序,现在在 TabBroadcast onReceive 内部,您可以执行以下操作:

handler.post(new Runnable() {
    public void run() {
        myTextview.setText("Text");
    }
});

您需要将 myTextview 设置为 final

于 2015-01-16T17:17:22.987 回答
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");
  } 
}
于 2013-02-01T05:31:36.903 回答