У меня возникла проблема с созданием динамической кнопки во фрагменте. Мой XML называется «home_fragment», и эта схема не может показаться, что можно найти в «rootView», потому что я получаю NullPointerException брошенное на этой линии:RelativeLayout View NULL для создания динамической кнопки
RelativeLayout ll = (RelativeLayout)rootView.findViewById(R.id.home_fragment);
И мой оператор печати подтверждает, что «LL» переменный нулевой. Это связано с тем, что я использую фрагменты, потому что этот код для создания динамической кнопки, похоже, работает для других. Вот мой код:
public class HomeFragment extends Fragment {
ViewGroup rootContainer;
LayoutInflater rootInflater;
private ButtonCreator bc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.home_fragment, container, false);
rootContainer = container;
rootInflater = inflater;
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
bc = (ButtonCreator) activity;
}
public interface ButtonCreator{
void buttonCreator(Drawable drawable, String string);
}
// Create button from icon and image name
// Change Drawable back to BitmapDrawable
public void createButton (Drawable drawable, String applicationName){
Log.d("tag_name", "createButton");
try {
ImageButton btn = new ImageButton(getActivity());
btn.setImageDrawable(drawable);
View rootView = rootInflater.inflate(R.layout.home_fragment, rootContainer, false);
Log.d("tag_name", "RootInflater" +rootInflater);
Log.d("tag_name", "RootContainer" +rootContainer);
Log.d("tag_name", "RootView" +rootView);
RelativeLayout ll = (RelativeLayout)rootView.findViewById(R.id.home_fragment);
Log.d("tag_name", "RelativeLayout" +ll);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
ll.addView(btn, lp);
}
catch (Exception e){
System.out.println("Exception is "+e.toString());
e.printStackTrace();
}
}
}
Вот home_fragment XML:
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/home_fragment_scroll">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:layout_margin="5dp"
android:id="@+id/home_fragment"
>
</RelativeLayout>
</HorizontalScrollView>
Вот MainActivity:
public class MainActivity extends FragmentActivity implements MenuFragment.OnMenufragListener, HomeFragment.ButtonCreator {
// called when the activity is first created
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RepeatTask();
}
@Override
public void onMenufrag(Fragment s) {
// get body fragment (native method is getFragmentManager)
HomeFragment fragment = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.home_fragment);
// if fragment is not null and in layout, set text, else launch BodyActivity
if ((fragment!=null)&&fragment.isInLayout()) {
fragment.getView();
} else {
Intent intent = new Intent(this,HomeFragment.class);
startActivity(intent);
}
}
@Override
public void buttonCreator(Drawable d,String a) {
HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().getFragments().get(1);
homeFragment.createButton(d,a);
}
private void RepeatTask()
{
repeatTaskThread = new Thread()
{
public void run()
{
while (true)
{
try {
String applicationName = "app";
Drawable draw = getResources().getDrawable(R.drawable.settings_camera);
buttonCreator(draw, applicationName);
//createbutton.createButton(bitmapdrawable, applicationName);
Log.d("tag_name", "Entered Home Fragment");
//socket.close();
} catch (Exception e) {
System.out.println("Exception is "+e.toString());
}
try
{
// Sleep for 5 seconds
Thread.sleep(5000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
};
};
repeatTaskThread.start();
}
}
Вот main.xml (где фрагменты расположены):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_gravity="center"
android:orientation="horizontal"
android:weightSum="1">
<fragment
android:id="@+id/menuFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
class="it.anddev.bradipao.janus.MenuFragment"
tools:layout="@layout/fr_menu">
</fragment>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toEndOf="@id/menuFragment"
android:layout_toRightOf="@id/menuFragment"
android:layout_below="@+id/my_apps_container"
android:layout_alignBottom="@id/menuFragment" />
</RelativeLayout>
Здесь MenuFragment.java (для fr_menu.xml, предположим, что это просто пустой относительная компоновка):
public class MenuFragment extends Fragment {
// activity listener
private OnMenufragListener menufragListener;
// interface for communication with activity
public interface OnMenufragListener {
public void onMenufrag(Fragment s);
}
// onAttach
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
menufragListener = (OnMenufragListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnMenufragListener");
}
}
// onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create App with Body Fragment in display, and be able to replace it with other fragments
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.container, new HomeFragment()).commit();
}
// onActivityCreated
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
// onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fr_menu, container, false);
return view;
}
// (recommended) method to send command to activity
private void sendBodyTextToActivity(Fragment s) {
menufragListener.onMenufrag(s);
}
}
Вот мой StackTrace
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus D/tag_name: createButton
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus D/tag_name: R[email protected]2204b848
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus D/tag_name: RootContainerandroid.widget.FrameLayout{22047268 V.E..... ........ 254,67-772,583 #7f0b006b app:id/container}
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus D/tag_name: RelativeLayoutnull
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus I/System.out: Exception is java.lang.NullPointerException
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus W/System.err: java.lang.NullPointerException
05-04 19:05:40.452 3302-3325/it.anddev.bradipao.janus W/System.err: at it.anddev.bradipao.janus.HomeFragment.createButton(HomeFragment.java:146)
05-04 19:05:40.462 3302-3325/it.anddev.bradipao.janus W/System.err: at it.anddev.bradipao.janus.MainActivity.buttonCreator(MainActivity.java:80)
05-04 19:05:40.462 3302-3325/it.anddev.bradipao.janus W/System.err: at it.anddev.bradipao.janus.MainActivity$1.run(MainActivity.java:166)
Пожалуйста, покажите код, как вы используете этот класс Fragment в деятельности –
Кроме того, 'home_fragment.xml ', пожалуйста. –
Определенно спасибо @ cricket_007 Один раз в секунду. Я хочу, чтобы он обновился выше :) –