Is it possible to treat multiple views together as a single view on Android?
For example, suppose you have a layout that is represented by the following outline:
<!--layout/my_view.xml (approximate)-->
<LinearLayout>
<TextView android:id="@+id/title"/>
<TextView android:id="@+id/content"/>
</LinearLayout>
And let's say you have MyView that inherited this route, LinearLayout
class MyView extensions LinearLayout {
TextView titleTV, contentTV;
// Constructors and all
publicMyView(Context context, AttributeSetattrs, int defStyleAttr){
super(context, attrs, defStyleAttr);
View root=LayoutInflater.from(context).inflate(R.layout.my_view,this);
titleTV=root.findViewById(R.id.title);
contentTV=root.findViewById(R.id.content);
//TypedArray, etc.
}
public void setTitle (String title) {
titleTV.setText(title);
}
// All of the following methods
}
Suppose you have the following activities to take advantage of it:
Layout Files
<!--layout/activity_main.xml (summary)-->
<LinearLayout>
<***.***.MyView android:id="@+id/my_view_1"/>
<***.***.MyView android:id="@+id/my_view_2"/>
</LinearLayout>
Class
class MainActivity extensions AppCompatActivity{
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.oncreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view=findViewById(R.id.my_view_1);
// The view instance of LinearLayout is displayed, so I cannot do the following.
MyView myView= (MyView) findViewById (R.id.my_view_2); // Fails without cast
myView.setTitle("Title");
}
}
As written in the code, the instance obtained by findViewbyId becomes the instance of the root and the critical method is not available.
I remember inheriting LinearLayout, but if I inherit View instead, the View is not a ViewGroup, so it doesn't match the inflate argument.
class MyView extensions View {
publicMyView(Context context, AttributeSetattrs, int defStyleAttr){
View root=LayoutInflater.from(context).inflate(R.layout.my_view,this);
// This is not a ViewGroup, so x
View root=LayoutInflater.from(context).inflate(R.layout.my_view, null);
// Error running x
}
}
Also, I saw Q&A and DevelopersBlogs that should be enclosed with <merge>
, but the above problem did not solve it well.
How can I get an instance of CustomView?
/*Note*/
First of all, I would like to report the resolution.(I don't understand...)
About 1
·This time, I think there is a problem with the class, and I have extracted the minimum number that shows the hierarchy.
About 2
·I just called this (context, attrs, defStyleAttr) internally, so I omitted it
About 3
·Explicit cast is omitted due to generic type because API Level 26 was used.
I should have described all of them in detail
I was programming on Android Studio Preview, so I rewritten it on Android Studio 2.6 and it worked fine.
So I ran it again to check for errors in the Preview version, and this time it ran smoothly.
I'm not sure, but it's solved.
I have not rewritten the affected part from the time the error occurred until it was successfully executed, and I am not sure why the type suddenly changed.
You should be able to do it
MyView myView=(MyView) findViewById(R.id.my_view_1);
myView.setTitle("Title");
I think it was written in a hurry, but I think there are some mistakes in the description.
Otherwise, I think you can get a more accurate answer by pasting the log.
By the way, #inflate(Context,int,ViewGroup)
is available for the class that inherits View (although I'm just doing the same internally…) for your information.
© 2024 OneMinuteCode. All rights reserved.