প্রথমে সন্তানের পিতামাতার কাছে রিমুভ ভিউ () কল করুন


138

প্রথমে একটু ব্যাকগ্রাউন্ড:

স্ক্রোলভিউয়ের ভিতরে আমার একটি বিন্যাস রয়েছে। প্রথমে, ব্যবহারকারী যখন স্ক্রিনে স্ক্রোল করে তখন স্ক্রোলভিউ স্ক্রোল। যাইহোক, নির্দিষ্ট পরিমাণ স্ক্রোলের পরে, আমি স্ক্রোল ভিউতে স্ক্রোলটি অক্ষম করেছিলাম "লেভেল ফোকাস" বাচ্চার বিন্যাসের ভিতরে একটি ওয়েবভিউতে সরানো। এইভাবে, স্ক্রোলভিউ লাঠি এবং সমস্ত স্ক্রোল ইভেন্টগুলি এর ভিতরে থাকা ওয়েবভিউতে যায়।

সুতরাং, কোনও সমাধানের জন্য, যখন স্ক্রোলের প্রান্ত পৌঁছে যায়, আমি স্ক্রোলভিউ থেকে শিশু বিন্যাসটি সরিয়ে স্ক্রোলভিউয়ের পিতামাতার মধ্যে রাখি put (এবং স্ক্রোলভিউটি অদৃশ্য করে তুলি)।

// Remove the child view from the scroll view
scrollView.removeView(scrollChildLayout);

// Get scroll view out of the way
scrollView.setVisibility(View.GONE);

// Put the child view into scrollview's parent view
parentLayout.addView(scrollChildLayout);

সাধারণ ধারণা: (-> মানে রয়েছে)

পূর্বে: প্যারেন্টলেআউট -> স্ক্রোলভিউ -> স্ক্রোলচিল্ড লেআউট

এর পরে: প্যারেন্টলয়আউট -> স্ক্রোলচিল্ড লেআউট

উপরের কোডটি আমাকে এই ব্যতিক্রম দিচ্ছে:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
           at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
           at android.view.ViewGroup.addView(ViewGroup.java:1871)
           at android.view.ViewGroup.addView(ViewGroup.java:1828)
           at android.view.ViewGroup.addView(ViewGroup.java:1808)

আপনি কি জানেন কি হচ্ছে? আমি পরিষ্কারভাবে পিতামাতাকে অপসারণ কল করছি।

উত্তর:


289

সমাধান:

((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout);
//scrollView.removeView(scrollChildLayout);

পিতামাতার একটি রেফারেন্স পেতে সন্তানের উপাদানটি ব্যবহার করুন। পিতামাতাকে একটি ভিউ গ্রুপে কাস্ট করুন যাতে আপনি সরানোর দৃশ্য পদ্ধতিতে অ্যাক্সেস পান এবং এটি ব্যবহার করুন।

সমাধানের জন্য @ দোঙ্গশেংসিএনকে ধন্যবাদ


1
সমাধানটি ঠিক আছে, তবে "স্কলভিউ.রেমভভিউ (স্ক্রোলচিল্ডআউট)" কেন কাজ করবে না? দুটি লাইন এক হওয়া উচিত না?
andrea.rinaldi

@ andrea.spot, মনে হচ্ছে scrollView.removeView(scrollChildLayout)স্ক্রোলভিউয়ের বাচ্চাকে অপসারণ করার চেষ্টা করছে, স্ক্রোলভিউকে তার পিতামাতা ভিউগ্রুপ থেকে সরিয়ে না নেওয়ার জন্য
দিমিত্রি গ্রিয়াজিন

1
@ ব্যবহারকারী 25 আমি এটি আপনার জন্য খুব দেরিতে জানি কিন্তু নাল পয়েন্টার ব্যতিক্রম পিতা বা মাতা খালি থাকার কারণে দৃষ্টিভঙ্গি কোনও পিতামাতার সাথে সংযুক্ত থাকে না। যেহেতু শুরুতে কোনও পিতামাতা নেই, তাই সরানোর কিছুই নেই is if (mAdView.getParent()!=null) ((ViewGroup) mAdView.getParent()).removeView(mAdView);
তারেক

@ কাসগোকু আপনি আমাকে সাহায্য করতে পারেন দয়া করে আমি একটি বোতাম ক্লিকের তুলনায় আপেক্ষিক বিন্যাসে একটি খণ্ড দেখানোর চেষ্টা করছি। তবে এর প্রদর্শিত ত্রুটি "নির্দিষ্ট সন্তানের ইতিমধ্যে একটি পিতামাতা রয়েছে You আপনাকে অবশ্যই প্রথমে সন্তানের পিতামাতার উপর রিমুভ ভিউ () কল করতে হবে।" কীভাবে সমাধান করব?
ইমরানানা07

আমি আমার অ্যাপ্লিকেশনটিতে এই ত্রুটিটি পেয়েছি যা চ্যাট অ্যাপ্লিকেশনগুলির মধ্যে একটি। আমি এই সমস্যাটি সমাধান করার চেষ্টা করছি। আইকনটি সরানো হয়েছে তবে চিত্রগুলি আপলোড করার জন্য আমার আবার আইকনটি দরকার। ( Stackoverflow.com/q/58117428/10971384 ) এই আমার প্রশ্ন লিঙ্ক
Thangapandi

21

প্রথমে এর প্যারেন্ট ভিউ থেকে স্ক্রোলচিল্ডআলআউট সরানোর চেষ্টা করবেন?

scrollview.removeView(scrollChildLayout)

বা সমস্ত শিশুকে পিতামাতার দর্শন থেকে সরান এবং তাদের আবার যুক্ত করুন।

scrollview.removeAllViews()

আমি উপরের আমার প্রশ্নের মধ্যে কোডটিতে ইতিমধ্যে অপসারণকে কল করছি। সরানোভিউ () কোনওভাবেই কাজ করে না।
কাসগোকু

আপনি কি সরলভিউ () / সরানোআলভিউস () কে কল করছেন তার পিতা বা মাতা নিশ্চিত? আমি খুব অনুরূপ জিনিস করছি, এবং এটি আমার জন্য কাজ করে চলেছে।
dongshengcn

4
আপনি এর পিতামাতার দিকে নজর রেখে দেখতে পারেন: ভিউজেট প্যারেন্ট () ডেভেলপার.আ্যান্ড্রয়েড.
com

আপনি আমাকে দয়া করে সাহায্য করতে পারেন @dongshengcn আমি একটি বোতাম ক্লিকের তুলনায় আপেক্ষিক বিন্যাসে একটি খণ্ড দেখানোর চেষ্টা করছি। তবে এর প্রদর্শিত ত্রুটি "নির্দিষ্ট সন্তানের ইতিমধ্যে একটি পিতামাতা রয়েছে You আপনাকে অবশ্যই প্রথমে সন্তানের পিতামাতার উপর রিমুভ ভিউ () কল করতে হবে।" কীভাবে সমাধান করব?
ইমরানানা07

19

ক্রিয়াকলাপের সাথে অনক্রিটে বা টুকরা সহ অনক্রিটভিউতে।

 if (view != null) {
    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null) {
        parent.removeView(view);
    }
}
try {
    view = inflater.inflate(R.layout.fragment_main, container, false);
} catch (InflateException e) {

}

15

ঠিক আছে, আমাকে অদ্ভুত বলুন তবে আমি পরামর্শ দিই:

  final android.view.ViewParent parent = view.getParent ();

  if (parent instanceof android.view.ViewManager)
  {
     final android.view.ViewManager viewManager = (android.view.ViewManager) parent;

     viewManager.removeView (view);
  } // if

withoutালাই ব্যতীত instanceofভুল মনে হচ্ছে। এবং (ধন্যবাদ আমাকে বলার জন্য ইন্টেলিজ আইডিইএ) ইন্টারফেসের removeViewঅংশ ViewManager। এবং যখন একটি উপযুক্ত উপযুক্ত ইন্টারফেস পাওয়া যায় তখন একটি কংক্রিটের ক্লাসে ফেলে দেওয়া উচিত নয়।


3

আপনাকে যা করতে হবে তা পোস্ট () একটি রান্নেবল যা অ্যাডভিউ () করে।


কাজ হয়নি। এটি আমি চেষ্টা করেছি: স্ক্রোলভিউ.রেমভভিউ (স্ক্রোলচিল্ড লেআউট); scrollView.setVisibility (View.GONE); প্যারেন্টলয়আউট.পোস্ট (নতুন চলমান () চালানো O
কাসগোকু

1

আমি প্যারেন্ট ভিউ.রেমভিউ (চাইল্ডভিউ) কল করছিলাম এবং চাইল্ডভিউ এখনও প্রদর্শিত হচ্ছে showing আমি অবশেষে বুঝতে পেরেছিলাম যে কোনও পদ্ধতিটি কোনওভাবে দু'বার ট্রিগার হয়ে গেছে এবং চাইল্ডভিউকে প্যারেন্ট ভিউতে দু'বার যুক্ত করেছে।

সুতরাং, আপনার ভিউ যুক্ত করার আগে এবং তারপরে পিতামাতার কতগুলি সন্তান রয়েছে তা নির্ধারণ করতে প্যারেন্টভিউ.জেটচিল্ডকাউন্ট () ব্যবহার করুন। যদি শিশুটি অনেক বার যুক্ত হয় তবে শীর্ষস্থানীয় সর্বাধিক শিশু সরানো হচ্ছে এবং চাইল্ডভিউ অনুলিপিটি অপরিবর্তিত রয়েছে - যা দেখে মনে হচ্ছে রিমুভ ভিউ কাজ করার পরেও এটি কাজ করছে।

এছাড়াও, একটি ভিউ সরাতে আপনার View.GONE ব্যবহার করা উচিত নয়। যদি এটি সত্যিই সরানো হয় তবে আপনার এটি আড়াল করার দরকার নেই, অন্যথায় এটি এখনও রয়েছে এবং আপনি কেবল এটি নিজের থেকে গোপন করছেন :(


1

আমার ক্ষেত্রে, আমার কাছে বেসফ্রেগমেন্ট এবং অন্যান্য সমস্ত খণ্ডের উত্তরাধিকার সূত্রে রয়েছে।

সুতরাং আমার নির্জন OnDestroyView()পদ্ধতিতে এই লাইনগুলি যুক্ত করা হয়েছিল

@Override
public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    if (mRootView == null)
    {
        mRootView = (inflater == null ? getActivity().getLayoutInflater() : inflater).inflate(mContentViewResourceId, container, false);
    }
....////
}

@Override
public void onDestroyView()
{
    if (mRootView != null)
    {
        ViewGroup parentViewGroup = (ViewGroup) mRootView.getParent();

        if (parentViewGroup != null)
        {
            parentViewGroup.removeAllViews();
        }
    }

    super.onDestroyView();
}

আপনি কি পরবর্তী খণ্ড নির্বাচন করার চেষ্টা করেছেন এবং খুব দ্রুত পিছনে টিপুন?
iamthevoid

1

কোটলিন সলিউশন

কোটলিন পিতামাতার as?cast ালাইকে সহজ করে , বাম দিকটি যদি নাল হয় বা কাস্ট ব্যর্থ হয় তবে নাল ফেরান।

(childView.parent as? ViewGroup)?.removeView(childView)

কোটলিন এক্সটেনশন সলিউশন

আপনি যদি আরও এটিকে আরও সরল করতে চান তবে আপনি এই এক্সটেনশনটি যুক্ত করতে পারেন।

childView.removeSelf()

fun View?.removeSelf() {
    this ?: return
    val parentView = parent as? ViewGroup ?: return
    parentView.removeView(this)
}

এই ভিউটি শূন্য হলে, পিতামাতার দৃষ্টিভঙ্গি নালুক, বা পিতামাতার ভিউটি ভিউগ্রুপ না হলে এটি নিরাপদে কিছু করবে না

দ্রষ্টব্য: আপনি যদি পিতামাতার দ্বারা সন্তানের মতামতগুলি নিরাপদে অপসারণ করতে চান তবে এটি যুক্ত করুন:

fun ViewGroup.removeViewSafe(toRemove: View) {
    if (contains(toRemove)) removeView(toRemove)
}

0

আপনি যদি ইনডেক্স-অফভিউ পদ্ধতিটি -1 প্রত্যাবর্তন করে তবে ভিউ'র সূচক-অফভিউ পদ্ধতিটি -1 ফিরে আসে কিনা তা পরীক্ষা করে আপনি এটিও করতে পারেন।

ভিউ গ্রুপের ডিটাচভিউফ্রোমপ্যারেন্ট (ভি); ভিউগ্রুপের অপসারণের ডেটাচড ভিউ (v, সত্য / মিথ্যা) এর পরে;


0

আমি কী ভুল করছি তাই আমি এই ত্রুটিটি পেয়েছি এটি হ'ল আমি গতিশীল বিন্যাসটি ইনস্ট্যান্ট করছি না এবং এতে বাচ্চাদের যুক্ত করছি তাই এই ত্রুটিটি পেয়ে গেল


0

এখানে আমার সমাধান।

আসুন আপনাকে দুটি বলে TextViewsএবং এটিকে একটি LinearLayout(নামযুক্ত ll) রাখুন। আপনি LinerLayoutএটি অন্য একটি লাগাতে হবে LinerLayout

< lm Linear Layout> 
       < ll Linear Layout> 
             <name Text view>
             </name Text view>
             <surname Text view>
             </surname Text view>
       </ll Linear Layout> 
</lm Linear Layout> 

আপনি যখন এই কাঠামোটি তৈরি করতে চান আপনার উত্তরাধিকার হিসাবে পিতামাতাকে দেওয়া দরকার।

আপনি যদি কোনও onCreateপদ্ধতিতে এটি ব্যবহার করতে চান thisতবে যথেষ্ট হবে।

অন্যথায় এখানে সলিউশন:

LinerLayout lm = new LinearLayout(this); // You can use getApplicationContext() also
LinerLayout ll = new LinearLayout(lm.getContext());
TextView name = new TextView(ll.getContext());
TextView surname = new TextView(ll.getContext());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.