2012-11-14 12 views
6

Nella mia applicazione Android, ho un frammento-frammento1. All'interno quel frammento, Ho una funzione statica 'function1'.I cercato di definire un buttton all'interno di una funzione statica utilizzando,findViewById non funziona in una funzione statica all'interno del frammento

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

Ma Eclipse genera un errore tipo "non può fare riferimento statico al metodo non statico getActivity() dal tipo Fragment ". Cosa ho fatto di sbagliato? Ho bisogno che questa funzione1 sia statica, in modo da poterla chiamare da un'altra classe. Voglio dire, devo popolare la vista elenco dall'attività principale quando seleziono un particolare frammento.

Fragment1 =>

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); 

    } 

}

E il mio 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

'funzione1()' sembra essere non è statico! –

+0

L'ho modificato .. –

risposta

5

Modificare la firma del function1() di essere come:

public static void function1(Fragment f) 

ed impiego:

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

anziché:

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

e chiamare il metodo come questo:

function1(this); 

Tuttavia, questo metodo dovrebbe essere metodo istanza piuttosto che metodo statico se non c'è scopo per questo.

+0

Questa risposta è corretta ma non dovresti incoraggiare tale abuso della parola chiave statica. Non ci sono motivi per cui questi metodi siano statici. –

+0

@MarvinLabs Hai ragione, ma sembra che l'OP abbia bisogno di un metodo statico (vedi il titolo), quindi gli do una soluzione di conseguenza. –

+0

+1 per la risposta modificata;) –

2

Non utilizzare il metodo statico in quanto non può fare riferimento all'istanza Fragment1 a meno che non lo si fornisca come parametro di input. Oltre cambiare il ritrovamento di tasto come di seguito:

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

Al momento è:

static Button button; 

è necessario rimuovere la parola chiave static, e invece scrivere:

private Button button; 
0

Non v'è alcun motivo per qui per qualsiasi cosa essere statica (a parte le costanti inserite in MAIUSCOLE che dovrebbero essere entrambe dichiarate staticefinal).

Rimuovere tutte le parole chiave static dal codice e dovrebbe funzionare (a parte le variabili capitalizzati):

private Button button; 

// ... 

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

Devo chiamare function1 da un'altra classe. Quindi deve essere statico no? –

+0

Avrete comunque bisogno di passare questa funzione statica un'istanza del frammento. Quindi potresti anche chiamare quella funzione sull'istanza stessa. Inserisci alcuni dettagli nella tua domanda su come vuoi chiamare quella funzione da qualche altra parte in modo da poter suggerire un refactoring. –

+0

Ho modificato la mia domanda.Verificare ... –

0

@Override pubblica View onCreateView (LayoutInflater gonfiatore, ViewGroup contenitore, Bundle savedInstanceState) {

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


return v; 

}

0

È necessario gonfiare quel particolare lay usa un tale layout per trovare l'id.

**

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

**

Problemi correlati