2 myshining MyShining 于 2016.03.13 09:25 提问

Android利用单例模式更改控件的属性,无法实现的问题

这是MainActivity中的代码,主要是加粗部分的代码,本打算通过Button的Onclick方法,来调用单例里边的Txtchange方法,来改变TextView的text,但是就是不法实现,求大神指点

package com.example.controlproject0311;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);
    RelativeLayout mainLayout = new RelativeLayout(this);
    mainLayout.setId(11);
    setContentView(mainLayout);
    Button button = new Button(this);
    button.setId(20);
    button.setText("hello");
    button.setTextSize(40);
    button.setTranslationX(50);
    button.setTranslationY(60);
    mainLayout.addView(button);

    final TextView txtView = new TextView(this);
    txtView.setText("one");
    txtView.setId(12);
    mainLayout.addView(txtView);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // SingletonControl.getInstance().txtChange();
            Singleton2.getInstance().sayhello();
            ****Singleton2.getInstance().SetText(txtView.getId());
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}


这是单例的代码

package com.example.controlproject0311;

import android.app.Activity;
import android.widget.TextView;

public class Singleton2 extends Activity {
/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
private static Singleton2 instance = null;

/* 私有构造方法,防止被实例化 */
private Singleton2() {
}

/* 1:懒汉式,静态工程方法,创建实例 */
public static Singleton2 getInstance() {
    if (instance == null) {
        instance = new Singleton2();
    }
    return instance;
}

public void sayhello() {
    System.out.println("are you ok");
}

public void SetText(int id) {
    TextView textView = (TextView) findViewById(id);
    textView.setText("weew");
}

}


2个回答

dongfeng9ge
dongfeng9ge   Ds   Rxr 2016.03.14 09:32

没发现Txtchange方法

MyShining
MyShining 东风哥,我的错,是setText()方法
2 年多之前 回复
dengyaoning
dengyaoning   2016.03.14 15:03

首先不得不吐槽一下这样的写法,有点难以接受;
其次我猜测问题应该出在Singlton2的SetText方法中,注意此方法中的findViewById的引用者是Singlton2类型,
mainActivity中创建的TextView是在mainLayout上,而mainActivity setContentView(mainLayout),所以
要找到你想要的TextView,传进去的应该是MainActivity的实例。
可以这么写:
public void SetText(Activity activity ,int id) {
TextView textView = (TextView) activity.findViewById(id);
textView.setText("weew");
}
或是
public void SetText(View rootView ,int id) {
TextView textView = (TextView) rootView.findViewById(id);
textView.setText("weew");
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android 在线程中改变控件的属性
转载地址:http://blog.sina.com.cn/s/blog_58b5cfcc0100khf3.html
彻头彻尾理解单例模式及其在多线程环境中的应用
摘要:      本文首先概述了单例模式产生动机,揭示了单例模式的本质和应用场景。紧接着,我们给出了单例模式在单线程环境下的两种经典实现:饿汉式 和 懒汉式,但是饿汉式是线程安全的,而懒汉式是非线程安全的。在多线程环境下,我们特别介绍了五种方式来在多线程环境下创建线程安全的单例,即分别使用 synchronized方法、synchronized块、静态内部类、双重检查模式 和 Thr
关于单例的属性问题
才学iOS,现在遇到单例的理解问题,单例中的属性可以修改吗?根据定义似乎不应该啊。但是我通过如下测试,构造函数是不会再次加载,但是属性name是可以被修改的,单例是不是就是这样的?谢谢 import Foundation class Person: NSObject {          var name: String?     var age: Int?     var phone: St
设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题
设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,
在学习单例模式关于单例数据更新遇到个BUG!(错误)
最近在学习单例模式,在写代码关于单例模数据更新的时候遇到了问题,求大师解惑! 代码是这样的: 单例类: public class SingletonTest { private static SingletonTest instance = null; private int i= 0; public int getNum
Activity单例模式与onNewIntent
在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就会存在一点点小问题。 首先,在默认情况下,当您通过Intent启到一个Activity的时候,就算已经存在一个相同的正在运行的Activity,系统都会创建一个新的Activity实例并显示出来
Android与WebView交互
Android与WebView交互,通过Android控制WebView上控件,更改WebView属性
Android 在代码中设置控件属性
其实控件在代码中也能设置他的属性:  /**      * 在代码中设置控件属性      */     private void initView() {         //在代码中设置         layout=(LinearLayout) findViewById(R.id.linear);         layout.addView(creatrView("张三"))
Android Studio中Button等控件的Text属性英文默认大写的解决方法
在 Android Studio 中 xml 里面添加一个 Button、EditText 等控件后,它的 Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是android:textAllCaps。最后查看了一下Themes.xml文件,找到了一些端倪,发现在设置样式的时候,默认是把所有的字符串显示大写true。如图,是从android的Style.xml中的截图:【解
Android的单例模式的N种实现方式
说起Androidd的23种设计模式,恐怕大多数人不能说全,但是说起单例模式,大多数人不管是初级开发还是资深开发工程师都应该知道并且使用过。单例模式应该是最简单也是比较常用的设计模式了。但是你真的了解单例模式吗?最近看了《Android源码设计模式》这本书,才发现我原来理解的单例模式太冰山一角了。今天就书中谈到的单例模式做一下总结吧。 单例模式的定义及使用场景 定义:确保某个类只有一个实例,而