Literally the most basic app going on, just learning. I created a new XML file for a new layout, added some stuff, and I changed my setContentView() in MainActivity to match and I'm having trouble getting it working. Here's my code thus far.
My onCreate():
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_layout);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
}
and my XML new_layout:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="#+id/textView" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/editText"
android:layout_weight="1"
android:inputType="text" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="#+id/button" />
</LinearLayout>
Legit just attempting to get it to run.
Error:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidsdk.demo/com.example.androidsdk.demo.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f07003c (com.example.androidsdk.demo:id/container) for fragment PlaceholderFragment{4267dc90 #0 id=0x7f07003c}
EDIT:
Thank you:)
Looks like you dont have a placeholder for your fragment. You would have to place your fragment in a view to render it.
Related
Hello guys I'm working on application and my layout structure is as following :
RelativeLayout:
CompoundView:
CompoundView:
RelativeLayout:
Button
Button
RecyclerView
BrowseFragment:
Only rows
My problem is when I get to first row of browse fragment and first item in it and I want to go up (D-PAD-UP) to focus button it does nothing it works only when I push left ( D-PAD-LEFT). Anyone has solution for this ?
So the problem was in BrowseFrameLayout for some reason and to solve this issue I had to override onFocusSearchListener and manage focus myself.
In BrowseFragment which I extended I have this method :
public void workaroundFocus(){
if(getView() != null) {
View viewToFocus = getActivity().findViewById(R.id.view_to_focus);
BrowseFrameLayout browseFrameLayout = getView().findViewById(android.support.v17.leanback.R.id.browse_frame);
browseFrameLayout.setOnFocusSearchListener((focused, direction) -> {
if (direction == View.FOCUS_UP) {
return viewToFocus;
}
else {
return null;
}
});
}
}
And then:
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
workaroundFocus();
/*
Rest of the code
*/
}
And voila it works.
Since you are using the RelativeLayout you should layout the components in the order that you would like to be navigated.
Using the XML attributes presented in the RelativeLayout reference document, you will be able to establish an navigation order too:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp" >
<EditText
android:id="#+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="#string/reminder" />
<Spinner
android:id="#+id/dates"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="#id/name"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="#+id/times" />
<Spinner
android:id="#id/times"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="#id/name"
android:layout_alignParentRight="true" />
<Button
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="#id/times"
android:layout_alignParentRight="true"
android:text="#string/done" />
</RelativeLayout>
Here the dates Spinner is below the name EditText and at left of times Spinner, the times component is below the name one and the done Button is below times. See the image below:
See the Build Basic TV Layouts guide for more tv related details.
i have seen tutorials about fragments where a main activity is created with buttons for changing fragment after fragment. my question is, can i change fragments using the button of the called layout instead of the main activity's button/s. that is my current dilemma. before, my app runs using intent to change activities. but i came across a problem where i need to use fragment to solve it.
here is my "main" fragment code:
public class FragmentMain extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_main);
Log.d("Batelec", "fragment main started");
}
public void selectFrag(View view) {
Fragment fr;
fr = new FragmentMain2();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment1, fr);
fragmentTransaction.commit();
}
}
here's my layout file:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
tools:context="com.example.mypower_build101.FragmentMain" >
<fragment
android:id="#+id/fragment1"
android:name="com.example.mypower_build101.FragmentMain2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
and here's my main activity xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="#+id/btnAddDevice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="#string/txtAddDevice"
android:onClick="addClick" />
<Button
android:id="#+id/btnShowDevice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/btnAddDevice"
android:layout_centerHorizontal="true"
android:layout_marginTop="18dp"
android:text="#string/txtShowDevice"
android:onClick="showClick" />
<Button
android:id="#+id/btnMainRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/btnShowDevice"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp"
android:text="#string/txtRegister"
android:onClick="registerClick" />
<Button
android:id="#+id/btnShowDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/btnMainRegister"
android:layout_centerHorizontal="true"
android:layout_marginTop="29dp"
android:text="#string/txtShowDialog" />
<TextView
android:id="#+id/txtStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/btnShowDialog"
android:layout_centerHorizontal="true"
android:layout_margin="#dimen/listViewPadding"
android:layout_marginTop="20dp"
android:text="#string/txtNull"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Switch
android:id="#+id/switchGCM"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:checked="false"
android:text="#string/txtConnect2GCM"
android:textOff="#string/txtNo"
android:textOn="#string/txtYes" />
<TextView
android:id="#+id/txtBroadCastMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/lblStatus"
android:layout_alignStart="#+id/lblStatus"
android:layout_below="#+id/lblStatus"
android:layout_marginTop="17dp"
android:gravity="center"
android:text="#string/txtNull"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
if i really need to create buttons outside my already functioning activity, can you give some tips on how to properly code them i've seen that using static is not the best way to do it. also give me some tips on how to place the new button in the fragment because my main activity has 4 buttons which already used for changing activities.
all help is very much appreciated
Well, what you want to do is best to use fragments that programmatically additions on the activity.
I'll leave a small project where I have about an activity, and using two buttons, one fragment screen replacement by another.
You can find the complete code in the link that sends Gitub and you can download if you want is free for you to use and analyze as you wish.
Fragmetn replaces another Fragment. Github Project
And I leave the screenshot so you can see how it works.
I hope that my help has been very useful.
so you mean, i still need to have a separate button for changing activities and i can't anymore use my previous buttons. i just thought, can i use my previous main activity then call an activity which contain a fragment. when i click a button the main activity, the button calls the "fragmented" activity and change the fragment it calls
like this sorry the say i am not allowed to put image here yet
I developed an app, that uses Fragments as part of a Fragment.
public class LoginFragment extends Fragment
EditTextWithCameraButtonFrag userNameFrag;
EditTextWithCameraButtonFrag passwordFrag;
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
userNameFrag = (EditTextWithCameraButtonFrag)getChildFragmentManager()
.findFragmentById(R.id.fragment_username);
passwordFrag = (EditTextWithCameraButtonFrag) getChildFragmentManager()
.findFragmentById(R.id.fragment_password);
EditTextWithCameraButtonFrag is a subtype of Fragment.
This code works like a charm, running on android 5.1.1.
However, running it on Android 4.4.2 returns in userNameFrage and passwordFrag being null. So it seems, that the returned Child FragmentManager does not find the fields.
Is there any thing to consider when using getChildFragmentManager()with 4.4.3?
Thanks in advance!
EDIT:
This is the main fragment's XML:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="#dimen/huge"
android:orientation="vertical" >
<TextView
android:id="#+id/login_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="#dimen/activity_vertical_margin"
android:gravity="center"
android:textColor="#color/white"
android:textSize="40dp" />
<fragment
android:id="#+id/fragment_username"
android:name="com.example.app.fragments.EditTextWithCameraButtonFrag"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:id="#+id/fragment_password"
android:name="com.example.app.fragments.EditTextWithCameraButtonFrag"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="#+id/login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="#dimen/huge"
android:layout_marginStart="#dimen/huge"
android:layout_marginTop="#dimen/normal"
android:padding="#dimen/half"
android:text="Login" />
</LinearLayout>
And this the sub fragment's:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/editText_with_button_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="#+id/text_input_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.75"
android:background="#drawable/edit_text_login_top"
android:inputType="text"
android:padding="#dimen/normal" />
<Button
android:id="#+id/scan_text_view"
android:layout_width="wrap_content"
android:background="#android:color/transparent"
android:layout_height="wrap_content"
android:layout_alignEnd="#+id/text_input_field"
android:layout_alignTop="#+id/text_input_field"
android:layout_alignBottom="#+id/text_input_field"
/>
</RelativeLayout>
I just solved it- kinda.
After a LOT of reading it seems like it's possible to declare nested fragments via XML, but is not best practice.
So I decided to include FrameLayouts in the XML, and add the nested
Fragments via FragmentTransaction.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="#dimen/huge"
android:orientation="vertical" >
<TextView
android:id="#+id/login_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="#dimen/activity_vertical_margin"
android:gravity="center"
android:textColor="#color/white"
android:textSize="40dp" />
<FrameLayout
android:id="#+id/fragment_username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="#+id/fragment_password"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="#+id/login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="#dimen/huge"
android:layout_marginStart="#dimen/huge"
android:layout_marginTop="#dimen/normal"
android:padding="#dimen/half"
android:text="Login" />
</LinearLayout>
</RelativeLayout>
And in the main fragment's onCreate:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create userNameFrag
EditTextWithCameraButtonFrag userfragment = new EditTextWithCameraButtonFrag();
getChildFragmentManager().beginTransaction().replace(R.id.fragment_username, userfragment).commit();
// create passwordFrag
EditTextWithCameraButtonFrag passfragment = new EditTextWithCameraButtonFrag();
getChildFragmentManager().beginTransaction().replace(R.id.fragment_password, passfragment).commit();
}
This seems to work pretty good and- another plus- I also got rid of the the duplicate id bug.
From the code it is not clear where are these two fragments added:
1) Added in activity (in xml or in onCreate method)
Then this fragments are associated to fragemnt manager which belongs to Activity. You should use getActivity().getFragmentManager().find...
2) Fragemnts added in fragemnt xml layout
then they will be available after calling fragments onViewCreated method
Use getChildFragmentManager() for fragments which are defined in xml layout of this fragment or for fragments which are added by this getChildFragmentManager() fragment manager.
I'm trying to create a music player that will be visible in all my activities. To do this, I'm going to use a Fragment as some of you advised me earlier.
Since I have no experience with Fragments whatsoever, I decided to implement a fragment in a "filler" activity first.
I created a simple fragment containing only a button and some text, and try to inflate that in my filler activity.
However, after inflating this fragment does not show up. A message does get printed to LogCat telling me that the fragment has been inflating.
I'm pretty sure I'm missing something, but since I have no experience with this and I couldn't find a tutorial that quite explained how to do this, I don't know what it is that I'm missing.
Music player Fragment
public class AppMusicPlayer extends Fragment{
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
System.out.println("fragment added");
return inflater.inflate(R.layout.musicplayer_main, container, false);
}
}
Music Player layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="#+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is the fragment you're looking for" />
</LinearLayout>
Filler Activity
public class Filler extends FragmentActivity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filler);
Button b = (Button) findViewById(R.id.terug);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
});
}
}
Filler layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- Title bar -->
<RelativeLayout
android:id="#+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:background="#drawable/title_bar" >
<TextView
android:id="#+id/fillertitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Work In Progress"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" >
</TextView>
<Button
android:id="#+id/terug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:background="#drawable/button_back"
android:text="Back"
android:textColor="#FFFFFFFF"
android:textStyle="bold" >
</Button>
</RelativeLayout>
<!-- End of title bar -->
<TextView
android:id="#+id/wip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This section of the app has not been made yet. Work in progress." >
</TextView>
<fragment
android:id="#+id/musicPlayerFragment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:name="com.mobowski.app.player.AppMusicPlayer" />
</LinearLayout>
Obviously I'm doing something wrong, but what?
Note: I'm using Android 2.3 with the Compatibility library.
Any help is appreciated
The problem has been fixed with the help of Yashwanth Kumar and blessenm. One gave an XML solution, the other a programmatic solution. Now I'm just wondering which solution is the most desirable one. Are there any concessions to be made with either of the solutions, or does it all boil down to the programmer's preferred solution?
I haven't tried adding fragments directly to xml. But what I normally do is add a framelayout or linearlayout to the filler layout.
Suppose its id is 'fragment_holder'. I use the following code in the fragment activity right after setContentView. Try this
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_holder,new AppMusicPlayer(),"musicplayer");
ft.commit();
you should mention layout_height as 0dip, not the width in vertical linear layout.
change that it should work.
<fragment
android:id="#+id/musicPlayerFragment"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:name="com.mobowski.app.player.AppMusicPlayer" />
I declared a ImageView on my layout (XML) but when I try to grab it by the ID I'm getting a TextField!?! Then my code throw a ClassCastException.
Here is my layout code (splash.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
style="#android:style/Theme.Light" android:layout_height="wrap_content" android:background="#drawable/bg">
<ImageView android:layout_height="wrap_content" android:layout_width="match_parent" android:src="#drawable/splash" android:layout_marginTop="20pt" android:id="#+id/splashLogo"></ImageView>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="#string/app_name" android:id="#+id/splashTitle" android:textStyle="bold" android:textSize="#dimen/title_size" android:layout_gravity="center" android:lineSpacingExtra="#dimen/spacer" android:gravity="center"></TextView>
<TextView android:id="#+id/splashCopyleft" android:textSize="#dimen/version_size" android:lineSpacingExtra="#dimen/version_spacing" android:layout_width="wrap_content" android:gravity="center" android:layout_height="wrap_content" android:text="#string/app_version_info" android:layout_gravity="center" android:textColor="#color/version"></TextView>
</LinearLayout>
Here is my Java (Activity) code:
// imports
public class SplashActivity extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
// Grab a ClassCastException here
ImageView logo = (ImageView) findViewById(R.id.splashLogo);
// Never get here :'(
Log.i("GOT", logo.toString());
}
}
Sometimes Eclipse shifts resource ids. Try cleaning your project and building it again.
First, clean your project and then build it.
If the problem persists, close Eclipse and re-open it.