2012-11-14 44 views
6

在我的android應用程序中,我有一個fragment-fragment1。該片段裏面,我有一個靜態函數「function1'.I試圖定義使用靜態函數內的按鈕移到,findViewById不工作在片段內的靜態函數

button=(Buton)getActivity().findViewById(R.id.button1); 

但是Eclipse拋出類似「錯誤,因此無法使靜態參考非靜態方法getActivity()來自類型Fragment「。我做錯了什麼?我需要這個函數1是靜態的,以便我可以從另一個類中調用它。我的意思是,當我選擇一個特定的片段時,我必須從主活動中填充列表視圖。

片段1 =>

public class Fragment1 extends Fragment{ 


public static String feedurl="http://www.abcd.com/en/rssfeeds/1_2_3_5/latest/rss.xml"; 
static String URL = ""; 
static final String KEY_HEAD = "item"; // parent node 
static final String KEY_DATE = "pubDate"; 
public static String headflag=""; 
int f=0; 
static Button button; 
    HeadlinesAdapter adapter; 
    private TextView mMessageView; 
private Button mClearButton; 

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

    View v = inflater.inflate(R.layout.first_fragment, container, false); 


    return v; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 



    function1(); 
    populate_listview(); 

    } 


public static void function1() 
{ 


    URL="http://www.abcd.com/en/rssfeeds/1_2_3_5/latest/rss.xml"; 
    ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>(); 

    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 
    NodeList nl = doc.getElementsByTagName(KEY_HEAD); 
    NodeList itemLst = doc.getElementsByTagName("item"); 
    String MarqueeStr=""; 

    for (int i = 0; i < nl.getLength(); i++) { 
     HashMap<String, String> map = new HashMap<String, String>(); 
     Element e = (Element) nl.item(i); 
        newsList.add(map); 


} 
    button=(Buton)getActivity().findViewById(R.id.button1);;// Here it shows error. 
    adapter=new Adapter1(getActivity(), newsList);   
      list.setAdapter(adapter); 

    } 

}

而且我mainactivity是,

ViewpagerActivity =>

public class ViewPagerActivity extends FragmentActivity { 

    private ViewPager mViewPager; 
    private MessageLoader mLoader; 
    private Button mSenderButton, mReceiverButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // We get UI references 
     mViewPager = (ViewPager) findViewById(R.id.viewPager); 
     mSenderButton = (Button) findViewById(R.id.sender_button); 
     mReceiverButton = (Button) findViewById(R.id.receiver_button); 
     // We set pager adapter 
     mViewPager.setAdapter(new MyAdapter(this)); 
     // We set receiver button listener 


     mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 


      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
      { 

      } 

      int i=0; 
      public void onPageSelected(int position) { 
        if(position==0){ 

        }else if(position==1 && i==0){ 
         Fragment1.function1(); // Here Iam calling function1 

         i++; 
        } 

      } 


      public void onPageScrollStateChanged(int state) { 

      } 
      }); 

     mReceiverButton.setOnClickListener(new OnClickListener() {   

      public void onClick(View v) { 
       mViewPager.setCurrentItem(0); 
      } 
     }); 
     // We set sender button listener 
     mSenderButton.setOnClickListener(new OnClickListener() {    

      public void onClick(View v) { 
       mViewPager.setCurrentItem(1); 

      } 
     }); 
    } 

    /** 
    * Adapter for ViewPAger that manages background interactions with fragments 
    */ 
    private class MyAdapter extends FragmentPagerAdapter{ 

     private Context mContext; 
     private String[] frags = {Headlines.class.getName(), Kerala.class.getName()}; 

     public MyAdapter(FragmentActivity activity) { 
      super(activity.getSupportFragmentManager()); 
      mContext = activity; 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      Fragment frag = (Fragment) super.instantiateItem(container, position); 
      if(frag instanceof MessageLoader){ 
       mLoader = (MessageLoader) frag; 
      } 
      return frag; 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      return Fragment.instantiate(mContext, frags[pos]); 
     } 

     @Override 
     public int getCount() { 
      return frags.length; 
     } 

    } 




} 
+0

'功能1()'似乎不是一成不變的! –

+0

我改變了它.. –

回答

5

變化function1()簽名是因爲:

public static void function1(Fragment f) 

及用途:中

button = (Buton) f.getActivity().findViewById(R.id.button1); 

代替:

button = (Buton) getActivity().findViewById(R.id.button1); 

,並調用這樣的方法:

function1(this); 

然而,這種方法應該是實例方法而不是靜態方法如果沒有目的的話。

+0

這個答案是正確的,但你不應該鼓勵這種濫用static關鍵字。這些方法沒有任何理由是靜態的。 –

+0

@MarvinLabs你是對的,但是似乎OP需要一個靜態方法(參見標題),所以我給他一個相應的解決方案。 –

+0

+1編輯的答案;) –

2

請勿使用靜態方法,因爲它不能引用Fragment1實例,除非您提供它作爲輸入參數。除了改變如下按鈕的發現:

button = (Buton) getView().findViewById(R.id.button1); 
0

您目前有:

static Button button; 

您應該刪除static關鍵字,而是寫:

private Button button; 
0

這裏沒有理由因爲任何東西都是靜態的(除了你輸入CAPITALS的常量,它們應該被聲明爲staticfinal)。

刪除所有從你的代碼static關鍵字,它應該工作(除了大寫的變量):

private Button button; 

// ... 

public void function1() { 
    // ... 
} 
+0

我需要從另一個類調用function1。所以它需要是靜態的否? –

+0

無論如何,您將需要傳遞此靜態函數片段的一個實例。所以你不妨在實例本身上調用該函數。在關於如何從其他地方調用該函數的問題中提供一些更多細節,以便我們可以提出重構建議。 –

+0

我編輯了我的問題。請檢查... –

0

@覆蓋 公共查看onCreateView(LayoutInflater吹氣,ViewGroup中容器, 捆綁savedInstanceState){

View v = inflater.inflate(R.layout.first_fragment, container, false); 
button=(Button) v.findViewById(R.id.button1); 


return v; 

}

0

您必須擡高特定外行出一個使用佈局來找到id。

**

View v = inflater.inflate(R.layout.first_fragment, container, false); 
button=(Button) v.findViewById(R.id.button1); 
return v; 

**