I my app, I have somes XML. I want to modify a TextView, but it is not in the primary XML file for this Activity.
I tried:
TextView nav_playerid = (TextView) findViewById(R.id.nav_username);
nav_playerid.setText(id_joueur_connect);
But that won't work. How can I tell the app to get this specific XML File and modify this TextView?
An unqualified findViewById will search the present contentView of the Activity
to get this specific XML File
You need to inflate the other one.
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
final View v = inflater.inflate(R.layout.other_layout, null);
// See 'v.findViewById'
TextView nav_playerid = (TextView) v.findViewById(R.id.nav_username);
nav_playerid.setText(id_joueur_connect);
But that creates a new, blank layout, so you'd also need to add that inflated view to the content view of the activity in order to see it.
Related
What is difference between:
setContentView(R.layout.activity_main);
TextView txtView = (TextView)findViewById(R.id.text);
And
TextView textView = new TextView(this);
setContentView(textView);
I found these two pieces of code. In first the setContentView has a I'd passed to it about layout. And in second case it has a view passed as argument. Is textView also an id. I think the difference is that in first case, it is layout of activity_main as described in XML file(which contains textView as well) and in second case it is id of textView. Tell me if I am correct.
Also tell me what does 'this' refer to here. Why we are using findViewById in first case?
In the first code,
setContentView(R.layout.activity_main);
TextView txtView = (TextView)findViewById(R.id.text);
you are setting the content view of the container and then trying to access the view with ID - text.
For ex:
<RelativeLayout android:height="match_parent"
android:width="match_parent">
<TextView
android:id="#+id/text"
android:text="Hello"
android:height="wrap_content"
android:width="wrap_content"/>
</RelativeLayout>
In this layout file TextView has the id - text
So,in order to access the textview programatically, we make use of findViewById() t to get reference to view.
TextView textView = findViewById(R.id.text);
now we can make use of this view reference to make changes to the view.
For example we can change text like,
textView.setText("This is a test");
As far as
TextView textView2 = new TextView(this);
is concerned, you're creating a TextView dynamically. This can be added to the parent container as and when required.
Activity.setContentView() has 2 signatures. One is taking a layout id as parameter, the other is taking a View as parameter. There is actually a third one taking a View and ViewGroup.LayoutParam as input.
All three methods take what they get (a View or a layout to inflate) and set it as their root element. So in short: There is no real difference here. Just a few options the developer can choose from to tell the Activity about its root UI element
Also see: setContentView description
The line TextView txtView = (TextView)findViewById(R.id.text); is then searching for a TextView with the id "text" within the Activitys Content (in that case every view in R.layout.activity_main).
The line TextView textView = new TextView(this); is creating a new TextView programmatically instead of inflating a layout xml. The this parameter is a Context instance. A Context instance is always needed to create a View. An Activity is a Context.
When you're using the following:
setContentView(R.layout.activity_main);
TextView txtView = (TextView)findViewById(R.id.text);
you're using the activity_main layout as the content of the activity. whenever you're trying to bind the view with findViewByid(), it only search for the views inside the layout and will giving you an error if you're trying to bind views outside the layout. See setContentView (int layoutResID) for details.
When you're using the following:
TextView textView = new TextView(this);
setContentView(textView);
You're creating a TextView with the activity (this) as the context with new TextView(this);. Please be noted that you always need a context whenever you're creating a View.
Then with setContentView(textView); you're setting the textView as the sole content of the activity. See setContentView (View view) for details.
im developing an application and I need to add elements dynamically. I wonder if I can append elements (stored in a XML file) in my current Activity, like innerHTML in JavaScript.
I tried LayoutInflater but that replaces all the content and I need to append.
Thanks!
The easiest way to do this is to use the LayoutInflater as you said. I'm not sure how you were doing it (hence why I asked to see your inflating code), but the simplest way to understand is to do the following:
LayoutInflater inflater = getLayoutInflater();
View viewToAppend = inflater.inflate(R.layout.some_layout, null);
// Optional, create LayoutParams and apply to view with
// viewToAppend.setLayoutParams(params);
mainView.addView(viewToAppend);
How should I write my XML file, where should I put it and how should I reference them in the activity?
This is what I got:
myView = getLayoutInflater().inflate(R.???someplace???.???somename???, null);
What should be set instead of someplace and somename ? And if I have created this XML with 2 elements (a TextView and a LinearLayout, for example) how can I make myView look like the first element and mySecondView look like the other element in that XML?
After solving it, will mainView.addView(myView) make myView appear in the Activity with the pre-defined style?
I've been reading that it is the best solution for defining style in a separate XML file and then applying it to a View created programmatically.
See this sample code for inflating view..
{
View headerView = inflater.inflate(R.layout.icms_article_detail_header, null, false);
articleDetailDataProvider = new IcmsArticleDetailDataProvider(mContext);
txtPageIndicator=(IjoomerTextView)headerView.findViewById(R.id.icmsTxtIndicator);
imgFavorite = (ImageView) headerView.findViewById(R.id.icmsImageFavorite);
imgShare = (ImageView) headerView.findViewById(R.id.icmsImageShare);
list.addHeaderView(headerView);
}
i want to add Layout Dynamically on Add button click and on Dynamic Layout show Datepicker,Timepicker Dialog and set value in given Edit Text. show in image on Date Click set Date Right side . Here problem Start when Add Second Same layout and set date it set only on newly created layout
For example you need to create xml layout file with ScrollView and LinearView inside.
Then in your Activity class:
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View main = inflater.inflate(R.layout.your_layout, null);
setContentView(main);
LinearLayout linear = (LinearLayout)main.findViewById(R.id.linear_layout);
and then in onClick method just:
View yourView = inflater.inflate(R.layout.yourView, null);
// Do whatever you want with your View, set up some variables etc.
and to add your view to main view:
linear.addView(yourView);
I know that this is not a direct answer to your question, but maybe will help you with dynamically adding Views.
Can anybody please tell What Inflator is and how it is being used in an Android application?
I don't know the exact use of it and Why it is being used.
My preferred way to handle inflation:
//First get our inflater ready, you'll need the application/activity context for this
LayoutInflater mInflater;
mInflater = LayoutInflater.from(mContext);
//Inflate the view from xml
View newView = mInflater.inflate(R.layout.my_new_layout, null);
//Then you'll want to add it to an existing layout object
mMainLayout.add(newView);
//Or perhaps just set it as the main view (though this method can also
// inflate the XML for you if you give it the resource id directly)
setContentView(newView);
Basically, you use it to inflate existing xml layouts at runtime. Usually you go ahead and insert those new views into previously defined ViewGroups or List objects.
Not quite sure what you mean, but if its related with inflating views, its used to load layout xml files into your application. e.g by
View myWelcome = View.inflate(this, R.layout.welcome, null);
Its easier and consider best practice to have you view definition inside layout xml files, instead of creating your views fully by code.
layout inflator is used to return a java object of your complete layout
suppose you have a layout xml file in which the root element is relative layout and it contains a imageview and textview then using layout inflator you can return a view object that refers to entire layout.
this basically is used in list view and grid view to plug into them a layout object of single row or element which is to be repeated.
you were asking for use of Inflator..
basically when you want to use two xml files in one java class ,inflator is used and its code is simple which is given below..
TextView text;
View layout;
LayoutInflater inflator=getLayoutInflater();
layout =inflator.inflate(R.layout.new_xml_that you want to use in that java class,null);
text=(TextView)layout.findViewById(R.id.text);
text.setText("progressing");
here i use textview,this is present in next xml with id=text
thats it..
if you find this worthy then please like this..
thanks