2012-11-14 12 views
6

私のアンドロイドアプリケーションでは、私はfragment-fragment1を持っています。そのフラグメントの中では、私は、静的な関数「function1'.Iを使用して、その静的関数内butttonを定義しようとした、findViewByIdはフラグメント内の静的関数では機能しません

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

を持っていますが、Eclipseは非静的メソッドをstatic参照できません」などのエラーがスローされます型FragmentからgetActivity()を呼び出します。私は間違っていますか?私はこのfunction1を静的にする必要があるので、別のクラスから呼び出すことができます。つまり、特定のフラグメントを選択すると、主なアクティビティからのリストビューに値を設定する必要があります。

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

    } 

}

そして、私の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

'はfunction1()'静的ではないように見えます! –

+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

この回答は正しいですが、そのような静的キーワードの悪用を奨励すべきではありません。これらのメソッドが静的である理由はありません。 –

+0

@MarvinLabsあなたは正しいですが、OPに静的メソッド(タイトルを参照)が必要なので、私はそれに応じてソリューションを提供しているようです。 –

+0

+1編集された回答;) –

2

入力パラメータとして入力しない限り、Fragment1インスタンスを参照できないので、静的メソッドを使用しないでください。他に以下のようにボタンの発見を変更します。

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

をあなたが現在持っている:

static Button button; 

あなたは、静的なキーワードを削除し、代わりに書く必要があります。

private Button button; 
0

ここには理由がありません何かが静的である(首都に入れた定数とは別に、両方ともstaticと宣言する必要があります)。

(離れて、大文字の変数から)あなたのコードからすべてのstaticのキーワードを削除し、それが動作するはずです:

private Button button; 

// ... 

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

function1を別のクラスから呼び出す必要があります。静的でない必要がありますか? –

+0

この静的関数にフラグメントのインスタンスを渡す必要があります。したがって、インスタンス自体でその関数を呼び出すこともできます。他の場所からその関数をどのように呼び出すかについての質問には、リファクタリングを提案するための詳細をいくつか入れてください。 –

+0

私の質問を編集しました。確認してください... –

0

@Override パブリックビュー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; 

**

関連する問題