2017-08-16 8 views
8

मैं अपनी ऐप डिबग कर रहा था और ImageView संदर्भ पर होवर करते हुए पाया कि यह ImageView के बजाय AppCompatImageView है। TextView (AppCompatTextView के साथ) के साथ ऐसा ही हुआ।एंड्रॉइड ऐप कॉम्पैम्प घटकों का चयन क्यों करता है जब मैं उन्हें स्पष्ट रूप से घोषित नहीं करता?

enter image description here

मैं विशेष रूप से इस व्यवहार क्योंकि इसके AppCompat सब के बाद के साथ एक समस्या नहीं है जबकि, लेकिन जब साथी डेवलपर के कोड का निरीक्षण, मैंने देखा, extends ActivityAppCompatActivity के बजाय और मैं लगभग एक के रूप में यह चिह्नित " बुरा अभ्यास "।

दूसरी ओर, जबकि वेक्टर छवियों पर काम कर रहा, मैं एक ImageView उपयोग कर रहा था और एक समस्या थी, क्योंकि मैं एक AppCompatImageView इस्तेमाल नहीं किया था और इसका उपयोग करने समाधान था:

ImageView not displaying correctly in the device

यह असंगत व्यवहार ने मुझे वास्तव में उन प्रथाओं के रूप में भ्रमित कर दिया है जिन्हें मुझे पालन करना चाहिए। क्या मुझे अभी से एक गतिविधि से विस्तार करना चाहिए?

+1

एक 'AppCompatActivity' स्वचालित रूप से कुछ प्लेटफ़ॉर्म के' AppCompat * 'संस्करणों को बना देगा, जब इसकी परत बहती है तो देखें। नियमित 'गतिविधि' नहीं होगी। यदि आप किसी भी एपकोम्पेट घटकों का उपयोग कर रहे हैं, तो 'AppCompatActivity' के साथ चिपके रहें। –

+0

** डाउनवॉटर के लिए: ** क्या आप कृपया डाउनवॉटिंग के तर्क को समझ सकते हैं? –

+0

लेआउट इन्फ्लूटर गतिशील रूप से दृश्य को वापस करने के लिए प्रतिबिंब का उपयोग करता है। गतिविधि AppCompat शैलियों और विषयों की वजह से AppCompat दृश्य उत्पन्न कर सकती है। –

उत्तर

-1

AppCompatImageView ImageView के समान काम करता है। समर्थन लाइब्रेरी AppCompat केवल पिछड़ा संगतता के लिए है। इसलिए यदि आप चाहते हैं कि आपका ऐप पिछड़ा संगत हो, तो आपको AppCompat क्लास का विस्तार करना चाहिए।

+0

मैंने पोस्ट किया गया प्रश्न देखें। ऐसा लगता है कि कुछ मामलों में AppCompat बनाम सामान्य का उपयोग करके बहुत अंतर आया है। –

+0

क्या आपने AppCompat या गतिविधि का उपयोग करते समय कोई अंतर देखा है? –

+0

मैंने वास्तव में केवल गतिविधि का उपयोग नहीं किया है क्योंकि Google AppCompatActivity का उपयोग करने की सिफारिश करता है लेकिन ImageView के साथ, मेरी पिछली ऐप वैक्टर के साथ काम करते समय क्रैश हो रही थी। समस्या यह जोखिम है कि आपको यह पता लगाने के लिए तैयार रहना होगा कि क्या दोनों के बीच कोई अंतर है, मैं समय की कमी के कारण उस बड़े जोखिम को लेने का जोखिम नहीं उठा सकता। –

1

क्या मुझे अभी से एक गतिविधि से विस्तार करना चाहिए?

नहीं। सामान्य घटक (गतिविधि) या कंपैट घटक (AppCompatActivity) के बीच का अंतर यह है कि कंपैट घटक को विरासत उपकरणों में नवीनतम UI घटकों का समर्थन करने के लिए डिज़ाइन किया गया है। यह पिछड़ा संगतता प्रदान करता है, इसलिए यदि आप विभिन्न प्रकार के उपकरणों का समर्थन कर रहे हैं तो आपको इसकी आवश्यकता होगी।

मैं विशेष रूप से इस व्यवहार क्योंकि इसके AppCompat के बाद सभी

हाँ आप कर रहे हैं ठीक है, जब एक AppCompatActivity अंदर से एक छवि दृश्य का उपयोग कर, एक सामान्य छवि दृश्य दिखाई देगा के साथ एक समस्या नहीं है जबकि AppCompatImageView के रूप में परिवर्तित किया गया।

AppCompatImageView

AppCompatImageView बारे में अधिक पढ़ने के लिए इस लिंक का पालन करें।

5

"क्या मैं अभी से एक गतिविधि से विस्तार करना चाहिए" का संक्षिप्त उत्तर? नहीं, आपको AppCompatActivity का विस्तार करना चाहिए क्योंकि यह पुराने उपकरणों को पीछे की संगत सुविधाएं प्रदान करता है।

एक imageView जो सहित मंच के पुराने संस्करणों, पर संगत सुविधाओं का समर्थन करता: AppCompatImageView के मामले में

  • ViewCompat में पृष्ठभूमि टिंट विधियों के माध्यम से इसकी पृष्ठभूमि के गतिशील रंग देता है।
  • पृष्ठभूमि टिंट और पृष्ठभूमि टिंटमोड का उपयोग कर पृष्ठभूमि टिंट की सेटिंग की अनुमति देता है।
  • ImageViewCompat में छवि टिंट विधियों के माध्यम से अपनी छवि के गतिशील रंग की अनुमति देता है।
  • टिंट और टिंटमोड का उपयोग कर छवि टिंट की सेटिंग की अनुमति देता है।

इसके अलावा, यह पुराने Android संस्करण के लिए वेक्टर ड्रॉएबल के साथ संगतता कहते हैं।

विसंगतियों

के रूप में यह AppCompatImageView से समझाया गया है के बारे में स्पष्टीकरण:

यह स्वचालित रूप से जब आप अपने लेआउट में imageView का उपयोग किया जाएगा और इसे उच्च-स्तरीय गतिविधि/संवाद द्वारा प्रदान की जाती है appcompat।

तो, यह अप्रत्याशित नहीं है।

यह कैसे काम करता

AppCompatActivity एक LayoutInflater.Factory2 स्थापित करता है कुछ दृश्यों की मुद्रास्फीति रोकना। इस inflater का कोड AppCompatViewInflater.java में देखा जा सकता है।

public final View createView(View parent, final String name, @NonNull Context context, 
     @NonNull AttributeSet attrs, boolean inheritContext, 
     boolean readAndroidTheme, boolean readAppTheme, boolean wrapContext) { 
    final Context originalContext = context; 

    // ... 

    View view = null; 

    // We need to 'inject' our tint aware Views in place of the standard framework versions 
    switch (name) { 
     case "TextView": 
      view = new AppCompatTextView(context, attrs); 
      break; 
     case "ImageView": 
      view = new AppCompatImageView(context, attrs); 
      break; 
     case "Button": 
      view = new AppCompatButton(context, attrs); 
      break; 
     case "EditText": 
      view = new AppCompatEditText(context, attrs); 
      break; 
     case "Spinner": 
      view = new AppCompatSpinner(context, attrs); 
      break; 
     case "ImageButton": 
      view = new AppCompatImageButton(context, attrs); 
      break; 
     case "CheckBox": 
      view = new AppCompatCheckBox(context, attrs); 
      break; 
     case "RadioButton": 
      view = new AppCompatRadioButton(context, attrs); 
      break; 
     case "CheckedTextView": 
      view = new AppCompatCheckedTextView(context, attrs); 
      break; 
     case "AutoCompleteTextView": 
      view = new AppCompatAutoCompleteTextView(context, attrs); 
      break; 
     case "MultiAutoCompleteTextView": 
      view = new AppCompatMultiAutoCompleteTextView(context, attrs); 
      break; 
     case "RatingBar": 
      view = new AppCompatRatingBar(context, attrs); 
      break; 
     case "SeekBar": 
      view = new AppCompatSeekBar(context, attrs); 
      break; 
    } 

    if (view == null && originalContext != context) { 
     // If the original context does not equal our themed context, then we need to manually 
     // inflate it using the name so that android:theme takes effect. 
     view = createViewFromTag(context, name, attrs); 
    } 

    // ... 

    return view; 
} 

मजबूर:

समारोह बनाने ViewsAppCompatViewInflater#createView(View, String, Context, AttributeSet, boolean, boolean, boolean, boolean) है, और आप यहाँ देख सकते हैं यह (पैकेज यह लगाकर बिना) साधारण दृश्य नाम के लिए जाँच करता है के रूप में के लिए जिम्मेदार है, और AppCompat* संस्करण बजाय बनाता है गैर AppCompat के उपयोग विचार

तो, आदेश के निर्माण के लिए मजबूर करने में एक नियमित ImageView (कोई AppCompatImageView), जबकि अभी भी AppCompatActivity का उपयोग कर आप विशेष की जरूरत है कैसे लेआउट मुद्रास्फीति काम करता है आप Chris Jenx, Calligraphy के लेखक द्वारा अद्भुत बात "LayoutInflater: Friend or Foe?" देख सकते हैं पर अधिक जानकारी के लिए

<android.widget.ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@mipmap/test"/> 

: पूरा वर्ग के नाम cify, उदाहरण के लिए।

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

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