2012-06-12 17 views
15

से एक गतिविधि के टेक्स्ट व्यू को कैसे अपडेट करें Iam android/जावा प्रोग्रामिंग के लिए नया Iam। मेरे पास दो वर्ग हैं, एक गतिविधि और अन्य सामान्य वर्ग है। मेरी गतिविधि कक्षा में 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"); 
    } 
} 
+0

मैं वास्तव में ब्रैग या कुछ भी नहीं करना चाहता, लेकिन यहां एकमात्र सही उत्तर मैंने प्रदान किया है: https://stackoverflow.com/questions/10996479/how-to-update-a-textview-of-an -एक्टिविटी-से-एक-क्लास/47637313 # 47637313 (हालांकि एली के ठीक तब तक ठीक है जब तक वे सही ढंग से मौत की प्रक्रिया को लेते हैं) – EpicPandaForce

उत्तर

38

आपको कन्स्ट्रक्टर के माध्यम से संदर्भ संदर्भ पारित करना होगा।

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"); 
    } 
+1

क्या हैViewById संदर्भ का एक तरीका है? गतिविधि और दृश्य से – Riskhan

+0

। – adatapost

+1

समाधान प्रदान करने के लिए धन्यवाद – Riskhan

3

आप अपने Activity में एक getter विधि बना सकते हैं।

अपने Activity वर्ग में:

public TextView getTextView() 
{ 

TextView txtView = (TextView)findViewById(R.id.text); 
return txtView; 
} 

अपने ClassB वर्ग में:

public void Update() 
{ 
      MainMenu obj = new MainMenu(); 
      TextView tv = obj.getTextView(); 
      tv.setText("hello"); 

} 
+0

द्वारा वर्णित एक इंटरफ़ेस का बेहतर उपयोग करें, लेकिन मैं एवीडी – Riskhan

8

पिछले दो उदाहरण TextView अन्य वर्ग के भीतर सीधे इस्तेमाल करने की आवश्यकता है। हालांकि, ऐसे मामले हैं जहां टेक्स्टव्यू दूसरे वर्ग में मौजूद नहीं होना चाहिए। जैसे आपकी कक्षा बी विभिन्न गतिविधियों को अपडेट करने के लिए उपयोग की जाती है, जहां टेक्स्टव्यू पर कुछ गतिविधि अपडेट की गई है, अन्य लोग संपादन टेक्स्ट पर हो सकते हैं।

इसलिए नीचे दिया गया समाधान आपको इस बात पर मार्गदर्शन करता है कि आप अपने टेक्स्ट व्यू को अन्य कक्षा से कैसे रद्द कर सकते हैं, फिर भी आप जो भी चाहते हैं उसे हासिल कर सकते हैं। यह इंटरफ़ेस दृष्टिकोण का उपयोग कर रहा है।

सबसे पहले, एक अंतरफलक जहां गतिविधि के लिए बातचीत करने के लिए वर्ग बी हो सकता था घोषित, MyCallBack लागू करता है, बुला यह अपनी गतिविधि में

public interface MyCallBack 
{ 
    // Declaration of the template function for the interface 
    public void UpdateMyText(String mystr); 
} 

अगला MyCallBack, और इसलिए यह समारोह परिभाषा है। इस समारोह में, आपको कक्षा बी से स्ट्रिंग प्राप्त होगी, जो आप जो भी चाहें कर सकते हैं उदा। TextView (या EditText आदि ...)

public Class MyActivity extends activity implements MyCallBack; 
{ 
    // ... whatever code of your activity 

    @Overrid 
    public void UpdateMyText(String mystr) 
    { 
     TextView txtView = (TextView)findViewById(R.id.text); 
     txtView.setText(mystr); 
    } 
} 

अन्त में, तो आप यह घोषणा कर सकता है ClassB कि MyCallBack में ले जाता है (अर्थात, आपके गतिविधि वर्ग वस्तु भी एक MyCallBack है कि करते हैं)। वहां से आप गतिविधि को वापस संवाद करने के लिए ClassB का उपयोग करें और मिल सकता है इसे अद्यतन यह UpdateMyText समारोह के माध्यम से TextView है

public class ClassB { 
    MyCallBack mCallBack = null; 
    public ClassB(MyCallBack callBack){ 
      this.mCallBack=callBack; 
    } 


    public void dosomething(){ 
     // Do something to get String 
     String myString = str; 
     this.mCallBack.UpdateMyText(str); 
} 

आशा इस ClassB की गतिविधि संपत्ति decoupling के बेहतर architected संरचना में मदद करता है।

+0

के साथ जाता हूं जिसमें आपने किस श्रेणी में इंटरफ़ेस रखा था? धन्यवाद – pewpew

+1

आप इसे शीर्ष स्तर के इंटरफ़ेस के रूप में रख सकते हैं या यह कक्षा बी – Elye

0

आप निम्न चीज़ें कर सकते हैं। मैंने इसे आजमाया और यह काम आया। किसी अन्य वर्ग से विधि को कॉल करते समय बस टेक्स्ट व्यू के संदर्भ में पास करें। आपके संस्करण में समस्या यह है कि टेक्स्ट व्यू के बीच संघर्ष है क्योंकि आप इसे दो बार घोषित कर रहे हैं। इसके बजाय इसे केवल एक बार घोषित करें और किसी अन्य वर्ग में विधि को कॉल करते समय इसे तर्क के रूप में पास करें। चीयर्स !!

// 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"); 
     } 
    } 
3

यह वास्तव में एक भ्रामक "सरल" प्रश्न है, लेकिन वास्तव में एंड्रॉइड विकास के संदर्भ में एक जटिल समस्या है।

गतिविधियां "प्रक्रिया प्रविष्टि बिंदु" हैं, जिसका अर्थ है कि आप जो भी गतिविधि देखते हैं, वह "स्टार्ट-अप पर आपके आवेदन में प्रवेश का पहला बिंदु" के रूप में कार्य कर सकती है।लोग सोचते हैं कि केवल उस गतिविधि में MAIN/LAUNCHER इरादा फ़िल्टर शुरू होता है, लेकिन यह गलत है।

कोई भी गतिविधि "पहली गतिविधि" के रूप में कार्य कर सकती है, क्योंकि एंड्रॉइड वर्तमान सक्रिय नेविगेशन स्टैक के साथ किसी भी बिंदु से इसे पुनरारंभ कर सकता है।

वैसे भी, यह ध्यान में रखते हुए, एक गतिविधि View दिखा सकती है, और लोग अक्सर अपने ऐप की प्रत्येक स्क्रीन को पकड़ने के लिए गतिविधि का उपयोग करते हैं (इसे एंट्री पॉइंट के रूप में उपयोग करने के बजाय, और इसमें दृश्य नियंत्रकों को स्वैपिंग ~ टुकड़े)।

तो अगर आप एक से अधिक क्रियाएँ है, तो आप इस तरह से उन दोनों के बीच डाटा साझा करने की जरूरत है, कि आप इसे ध्यान में रखना है कि दोनों गतिविधियोंपहलेके रूप में किसी भी समय शुरू किया जा सकता है ऐप की गतिविधि


इसके लिए आपको क्या करने की जरूरत नहीं है "एक और वर्ग से सीधे पाठ दृश्य का पाठ सेट", लेकिन आप लिए नमूदार साझा डेटा संशोधित की जरूरत है।

नए जारी किए गए आधिकारिक Android Architecture ComponentsLiveData<T> कक्षा प्रदान करते हैं, जिसमें MutableLiveData<T> नामक उप-वर्ग है।

public class DataRepository { 
    private final MutableLiveData<MyData> data = new MutableLiveData<>(); 

    public LiveData<MyData> getMyData() { 
     return data; 
    } 

    public void updateText(String text) { 
     MyData newData = data.getValue() 
          .toBuilder() // immutable new copy 
          .setText(text) 
          .build(); 
     data.setValue(newData); 
    } 
} 

कहाँ:

एक और गतिविधि के लिए एक वर्ग से डेटा को अद्यतन करने के लिए आप क्या करना चाहिए एक वैश्विक डेटा के रूप में एक LiveData

public class MyApplication extends Application { 
    private static MyApplication INSTANCE; 

    DataRepository dataRepository; // this is YOUR class 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     INSTANCE = this; 
     dataRepository = new DataRepository(); 
    } 

    public static MyApplication get() { 
     return INSTANCE; 
    } 
} 

DataRepository बेनकाब करना चाहिए LiveData अवगत कराया है गतिविधि इस पर सदस्यता लेती है:

public class MyActivity extends AppCompatActivity { 
    DataRepository dataRepository; 

    TextView textView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MyApplication app = (MyApplication)getApplicationContext(); 
     dataRepository = app.getDataRepository(); 

     setContentView(R.layout.main_activity); 
     textView = findViewById(R.id.textview); 

     dataRepository.getMyData().observe(this, new Observer() { 
      @Override 
      public void onChange(MyObject myObject) { 
       textView.setText(myObject.getText()); 
      } 
     } 
    } 

तो इसे अपडेट करने के लिए इस ठीक से अपनी गतिविधि पाठ दृश्य अपडेट करेगा

DataRepository dataRepository = MyApplication.get().dataRepository(); 
dataRepository.updateText("my new text"); 

और: पाठ, आप DataRepository वर्ग पाने के लिए, और उस पर updateText फोन की जरूरत है।

+0

के भीतर रह सकता है क्या आप माइडाटाटा की तरह दिखने का उदाहरण दे सकते हैं? –

+0

कोई भी कोटलिन डेटा क्लास, या ऑटोवॉल्यू उत्पन्न मूल्य वर्ग। या फ़ील्ड के साथ बस कुछ यादृच्छिक POJO जिसमें गेटर्स/सेटर्स हैं। – EpicPandaForce

+0

ठीक है, मुझे लगता है कि मैं पीओजेओ में फिट होगा, लेकिन वास्तव में जिस मूल्य को मैं बदलने की कोशिश कर रहा हूं, उसके पास एक समकक्ष समकक्ष नहीं है क्योंकि यह POJO से मौजूदा तरीकों से गणना की गई मान है, मैं परेशानी में भाग रहा हूं tobuilder हल नहीं कर सकता। –

संबंधित मुद्दे