2016-05-04 4 views
-1

У меня возникла проблема с созданием динамической кнопки во фрагменте. Мой 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) 
+0

Пожалуйста, покажите код, как вы используете этот класс Fragment в деятельности –

+0

Кроме того, 'home_fragment.xml ', пожалуйста. –

+0

Определенно спасибо @ cricket_007 Один раз в секунду. Я хочу, чтобы он обновился выше :) –

ответ

0

Итак, во-первых, это не то, как вы загрузите фрагмент ... это не активность, так что вы не можете startActivity с фрагментом. Вам нужно использовать FragmentTransaction, как вы делали внутри MenuFragment.onCreate(), но это должно быть действительно похоже, что это должно быть onCreate() вашей деятельности.

Intent intent = new Intent(this,HomeFragment.class); 
startActivity(intent); 

В любом случае, вы знаете, эта линия возвращается null

RelativeLayout ll = (RelativeLayout)rootView.findViewById(R.id.home_fragment); 

, которая вызывается из вас повторно надувать макет фрагмента XML, который может быть также сделано путем замены этой линии

View rootView = rootInflater.inflate(R.layout.home_fragment, rootContainer, false); 

С этим

View rootView = getView(); 

Что касается получения, что RelativeLayout, вы могли бы сделать, что внутри onCreateView

private RelativeLayout ll; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.home_fragment, container, false); 
    ll = (RelativeLayout) view.findViewById(R.id.home_fragment); 
    return view; 
} 

public void createButton (Drawable drawable, String applicationName){ 
    // Some code... 

    ll.addView(); 
} 
+0

Благодарим за отзыв! Я попытаюсь исправить то, как я открываю свои фрагменты, как вы думаете, в чем проблема? Если я не изменю, как я открываю свои фрагменты, но я делаю другие изменения о том, что мой RelativeLayout возвращает null, я запускаю ошибку, которая «ll = view.findViewById (R.id.home_fragment);» Требуется быть RelativeLayout (как мы определили), но мы пытаемся установить его равным типу View, используя «view.findViewById». Можно ли открыть представление как тип RelativeLayout? –

+0

Вы просто бросили его. Я забыл об этом в своем ответе. –

+0

Хорошо, я понял, спасибо, но я все еще получаю исключение NullPointerException для RelativeLayout "ll". –

Смежные вопросы