33

Android/Java プログラミングは初めてです。私は 2 つのクラスを持っています。1 つは anActivityで、もう 1 つは通常のクラスです。私のアクティビティ クラスにはTextView. TextView通常のクラスからアクティビティ クラスのを更新できますか? ランダムなコードで試しましたが、失敗します。

// activity class
public class MainMenu extends Activity {
    public TextView txtView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView txtView = (TextView)findViewById(R.id.text);   
    }
}

// Other class
public class ClassB {
    public ClassB() {
        public void Update() {
            TextView txtView = (TextView)findViewById(R.id.text);
            txtView.setText("Hello");
        }
    }
}
4

9 に答える 9

61

コンストラクターを介してコンテキスト参照を渡す必要があります。

public class ClassB {
   Context context;
   public ClassB(Context context){
     this.context=context;
   }

   public void Update(){
        TextView txtView = (TextView) ((Activity)context).findViewById(R.id.text);
        txtView.setText("Hello");
   }
于 2012-06-12T12:22:23.070 に答える
33

前の 2 つの例はTextView、他のクラス内で直接使用する必要があります。TextViewただし、他のクラスに存在してはならない場合もあります。たとえば、 yourClassBがさまざまなアクティビティの更新に使用され、いくつかのアクティビティが を更新しTextView、他のアクティビティが を更新する場合がありEditTextます。

したがって、以下のソリューションはTextView、他のクラスから分離する方法をガイドできますが、それでも目的を達成することができます。インターフェイスアプローチを使用しています。

ClassBまず、 Activity と通信できるインターフェイスを宣言し、それを呼び出しMyCallbackます。

public interface MyCallback {
    // Declaration of the template function for the interface
    public void updateMyText(String myString);
}

次に、アクティビティで を実装しMyCallback、その関数定義を実装します。この関数では、 (またはなど)ClassBを更新するなど、好きなことを実行できる文字列を受け取ります。TextViewEditText

public class MyActivity extends AppCompatActivity implements MyCallback {
    // ... whatever code of your activity

    @Override
    public void updateMyText(String myString) {
        ((TextView)findViewById(R.id.text)).setText(myString);
    }
}

最後に、 をClassB取り込むことを宣言できMyCallbackます (つまり、Activity クラス オブジェクトも ですMyCallback)。そこからアクティビティに通信し、関数を介してClassB更新するために使用できます。TextViewupdateMyText

public class ClassB {
    MyCallback myCallback = null;

    public ClassB(MyCallback callback) {
        this.myCallback = callback;
    }

    public void doSomething() {
        // Do something to get String
        String myString = str;

        if (myCallback != null) {
            myCallback.updateMyText(myString);
        }
    }
}

これが、Activity を から適切に分離するための設計された構造をよりよく示すのに役立つことを願っていますClassB

于 2015-01-14T09:08:39.683 に答える
3

アクティビティ クラス内で他のクラス( )のオブジェクトを作成している場合、最も簡単な解決策はスルー コンストラクタClassBを渡すことです (アクティビティ クラスでオブジェクトを作成していない場合、この回答は役に立ちません)。したがって、例は次のようになります。TextView

// activity class
public class MainMenu extends Activity {
    public TextView txtView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        txtView = (TextView)findViewById(R.id.text);
        //instantiating a object of the ClassB and passing tv
        ClassB obj = new ClassB(txtView);
    }    

}

// other class
public class ClassB {
   //declarre tv
   TextView txtView;

   //get the tv as arg
   public ClassB(TextView tv){
        txtView = tv;
   }

   public void Update(){
        txtView.setText("Hello");
   }
}
于 2018-10-31T15:11:55.793 に答える
0

これは、別のレイアウト内のビューにアクセスするための kotlin コードです。

//inflate layout
  val view = inflate(this, R.layout.ly_custom_menu_item, null)
//access view inside the inflated    
val tv = view.findViewById<AppCompatTextView>(R.id.txtV_WalletBalance_SideMenu)
//set value to view
 tv.text = "Value"
//Add inflated Layout to something
于 2018-12-17T06:24:14.710 に答える
-1

次のことができます。私はそれを試してみましたが、うまくいきました。別のクラスからメソッドを呼び出すときに、TextView への参照を渡すだけです。あなたのバージョンの問題は、 TextView を2回宣言しているため、 TextView 間に競合があることです。代わりに、一度だけ宣言し、別のクラスでメソッドを呼び出すときに引数として渡します。乾杯!!

    // activity class


public class MainMenu extends Activity {
    public TextView txtView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        TextView txtView = (TextView)findViewById(R.id.text);
        ClassB.update(txtView);
    }    

}

    // other class



    public class ClassB {
       public ClassB(){
       }

       public void update(TextView tv){
            tv.setText("Hello");
       }
    }
于 2017-09-29T19:42:53.637 に答える