2015-04-01 67 views
0

我有一個抽屜佈局片段(在主要活動中),它顯示了一個可擴展列表,當我單擊擴展項目的一個子項目時,出現一個彈出窗口。這個自定義佈局彈出窗口包含文本視圖,列表視圖和2個按鈕。使用片段列表視圖

我給列表中查看ID:android:id="@android:id/list"從的ViewGroup在onCreateView函數返回一個空如下:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
     View rootView = inflater.inflate(R.layout.fragment_settings, null); 

,使類擴展片段不ListFragment

我做了以前的3步驟,以避免「內容具有ID屬性'android.R.id.list'不是ListFragment中的ListView類的視圖」錯誤

但我仍然有NullPointerException錯誤指向

failListView.setAdapter(adapter); 

當點擊 「故障安全設置」 項

我已經看到了一些建議,但他們都沒有得到有用的,像 rootView .findViewById?()不getActivity()。findViewById ()==>我已經做到了。 或在onCreateView函數之前聲明列表視圖。 我真的很生氣,我嘗試了很多與他人合作的建議。

即使,我一直在努力,這個片段添加到onActivityCreated功能

TestFailsafeAdapter adapter = new TestFailsafeAdapter(getActivity().getApplicationContext(), 
     R.layout.dialog,R.id.textView1, 
     getResources().getStringArray(R.array.failsafe_list)); 
    failListView.setAdapter(adapter); 

任何幫助將不勝感激。

以下是在彈出的窗口中使用的自定義佈局(dialog.xml):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 


    <LinearLayout 
     android:id="@+id/headers_container" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:layout_marginTop="5dp" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:text="FailSafe" 
      android:textSize="16sp" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="35dp" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/textView1" 
      android:text="On" 
      android:textSize="16sp" /> 

    </LinearLayout> 


    <ListView 
     android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="350dp" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/headers_container" 
     android:background="#ffeeaa" > 
    </ListView> 


    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:layout_below="@android:id/list" 
     android:orientation="horizontal" > 

     <Button 
      android:id="@+id/dialogButtonReset" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="5dp" 
      android:layout_marginTop="5dp" 
      android:text="Reset" /> 

     <Button 
      android:id="@+id/dialogButtonSend" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="5dp" 
      android:layout_marginTop="5dp" 
      android:text="Send" /> 
    </LinearLayout> 

</RelativeLayout> 

以下是具有可繪製佈局(SettingsFragment.java)的擴展列表的片段:

public class SettingsFragment extends Fragment { 


ExpandableListAdapter listAdapter; 
ExpandableListView expListView; 
List<String> listDataHeader; 
HashMap<String, List<String>> listDataChild; 

int position = 0; 
ListView failListView = null; 


public SettingsFragment() { 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // View rootView = inflater.inflate(R.layout.fragment_settings, container, false); 
    View rootView = inflater.inflate(R.layout.fragment_settings, null);  


    failListView = (ListView) rootView.findViewById(android.R.id.list); 


    TestFailsafeAdapter adapter = new TestFailsafeAdapter(getActivity().getApplicationContext(), 
    R.layout.dialog,R.id.textView1, getResources().getStringArray(R.array.failsafe_list)); 
    failListView.setAdapter(adapter); 

    return rootView; 
} 



@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 


    // get the listview 
    expListView = (ExpandableListView) getActivity().findViewById(R.id.lvExp); 

    // preparing list data 
    prepareListData(); 

    listAdapter = new ExpandableListAdapter(getActivity(), listDataHeader, listDataChild); 

    // setting list adapter 
    expListView.setAdapter(listAdapter); 

    // Listview Group click listener 
    expListView.setOnGroupClickListener(new OnGroupClickListener() { 


     public boolean onGroupClick(ExpandableListView parent, View v, 
       int groupPosition, long id) { 
      return false; 
     } 
    }); 

    // Listview Group expanded listener 
    expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      Toast.makeText(getActivity(), 
        listDataHeader.get(groupPosition) + " Expanded", 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    // Listview Group collasped listener 
    expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 

     @Override 
     public void onGroupCollapse(int groupPosition) { 
      Toast.makeText(getActivity(), 
        listDataHeader.get(groupPosition) + " Collapsed", 
        Toast.LENGTH_SHORT).show(); 

     } 
    }); 

    // Listview on child click listener 
    expListView.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
       final int groupPosition, final int childPosition, long id) { 
      // TODO Auto-generated method stub 


      if(listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition).equals("USB")){ 


       FragmentManager manager = getFragmentManager(); 

       /** Instantiating the DialogFragment class */ 
       AlertDialogRadio alert = new AlertDialogRadio(); 

       /** Creating a bundle object to store the selected item's index */ 
       Bundle b = new Bundle(); 

       /** Storing the selected item's index in the bundle object */ 
       b.putInt("position", position); 

       /** Setting the bundle object to the dialog fragment object */ 
       alert.setArguments(b); 

       /** Creating the dialog fragment object, which will in turn open the alert dialog window */ 
       alert.show(manager, "alert_dialog_radio"); 

      } 


      if(listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition).equals("Failsafe Setup")){ 

       Toast.makeText(getActivity()," Failsafe Setup",Toast.LENGTH_SHORT).show(); 


       // create a Dialog component 
       final Dialog dialog = new Dialog(getActivity()); 

       //tell the Dialog to use the dialog.xml as it's layout description 
       dialog.setContentView(R.layout.dialog); 
       dialog.setTitle("Failsafe Setup"); 


       ListView failListView = (ListView) dialog.findViewById(android.R.id.list); 
       Button dialogButtonReset = (Button) dialog.findViewById(R.id.dialogButtonReset); 
       Button dialogButtonSend = (Button) dialog.findViewById(R.id.dialogButtonSend); 


       dialogButtonReset.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getActivity()," Failsafe Reset",Toast.LENGTH_SHORT).show(); 

        } 
       }); 

       dialogButtonSend.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getActivity()," Failsafe Send",Toast.LENGTH_SHORT).show(); 
        } 
       }); 

       dialog.show(); 

      } 

      return false; 
     } // end of OnClickChild method 
    }); 



} 


private void prepareListData() { 
    listDataHeader = new ArrayList<String>(); 

    listDataChild = new HashMap<String, List<String>>(); 

    // Adding child data 
    listDataHeader.add("Connection"); 
    listDataHeader.add("Mission Limits"); 
    listDataHeader.add("Compass Calibration"); 
    listDataHeader.add("Sensor Calibration"); 
    listDataHeader.add("Failsafe"); 

// Adding child data 
    List<String> Connection = new ArrayList<String>(); 
    Connection.add("USB"); 
    Connection.add("Wi-Fi"); 


    List<String> MissionLimits = new ArrayList<String>(); 
    List<String> CompassCalibration = new ArrayList<String>(); 
    List<String> SensorCalibration = new ArrayList<String>(); 

    List<String> Failsafe = new ArrayList<String>(); 
    Failsafe.add("Failsafe Setup"); 


    listDataChild.put(listDataHeader.get(0), Connection); // Header, Child data 
    listDataChild.put(listDataHeader.get(1), MissionLimits); 
    listDataChild.put(listDataHeader.get(2), CompassCalibration); 
    listDataChild.put(listDataHeader.get(3), SensorCalibration); 
    listDataChild.put(listDataHeader.get(4), Failsafe); 

} 

}

回答

0

NPE這裏:

failListView.setAdapter(adapter); 

由於ListViewandroid:id/list id爲內部dialog.xml佈局這是Dialog佈局而不是在fragment_settings.xmlSettingsFragment片段佈局。

因此,使用該對話框的上下文或對象中這是不可能的訪問onCreateView

+0

這樣的ListView我怎麼能訪問elemnts在dialog.xml @ρяσѕρєяķ – 2015-04-01 09:29:07

+0

我添加一行SettingsFragment.java類這樣代碼如下所示: \t \t 查看rootView = inflater.inflate(R.layout.fragment_settings,container,false); \t \t rootView2 = inflater.inflate(R.layout.dialog,container,false); \t \t failListView =(ListView)rootView2.findViewById(android.R.id。清單); 所以列表視圖出現,但它是空的,爲什麼項目沒有出現?請幫忙嗎? – 2015-04-02 07:07:13

+0

@jaradat:從onCreateView返回'rootView2' – 2015-04-02 07:08:53