2016-11-10 202 views
0

我最近開始使用一個小型學校項目爲Android編碼。爲此,我已經有了一個帶有七個碎片的Viewpager。這些碎片包括每個TextView。當我點擊一個按鈕時,我希望這些TextViews立即改變他們的文本。在Viewpager中更改TextView的文本

爲此,我有一個用於改變文本的ToggleButton。我已經嘗試過的是在片段中有一個公共的「setText」方法,它將TextView的文本設置爲另一個方法(該方法在MainActivity中用String調用)。 但是我得到這個錯誤:非靜態方法setText(java.lang.String)不能從靜態上下文中引用。

所以,我的問題是:如何一次更改七個TextViews的文本?

這裏是我的代碼:

MainActivity:

package app.voet.kalenderversemitseneca; 

import android.content.Intent; 
import android.content.res.Resources; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.widget.Toolbar; 
import android.widget.ToggleButton; 


import java.util.ArrayList; 
import java.util.List; 

import app.voet.kalenderversemitseneca.Fragments.FiveFragment; 
import app.voet.kalenderversemitseneca.Fragments.FourFragment; 
import app.voet.kalenderversemitseneca.Fragments.SevenFragment; 
import app.voet.kalenderversemitseneca.Fragments.SixFragment; 
import app.voet.kalenderversemitseneca.Fragments.ThreeFragment; 
import app.voet.kalenderversemitseneca.Fragments.OneFragment; 
import app.voet.kalenderversemitseneca.Fragments.TwoFragment; 

public class MainActivity extends AppCompatActivity { 
private ViewPager viewPager; 
private Toolbar toolbar; 
private ToggleButton toggleButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 

    toggleButton = (ToggleButton) findViewById(R.id.toggleButton); 

} 


private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new OneFragment(), "ONE"); 
    adapter.addFragment(new TwoFragment(), "TWO"); 
    adapter.addFragment(new ThreeFragment(), "THREE"); 
    adapter.addFragment(new FourFragment(), "FOUR"); 
    adapter.addFragment(new FiveFragment(), "FIVE"); 
    adapter.addFragment(new SixFragment(), "SIX"); 
    adapter.addFragment(new SevenFragment(), "SEVEN"); 
    viewPager.setAdapter(adapter); 
} 
public void showAboutProjectView(View view){ 
    Intent intent = new Intent(this, aboutProjectActivity.class); 
    startActivity(intent); 
} 

public void onToggleClicked(View view) { 
    // Is the toggle on? 
    boolean on = toggleButton.isChecked(); 
    setText(on); 

} 
public void setText(boolean translationOn){ 
    if (translationOn){ 
     Resources res = getResources(); 
     String[] versOne = res.getStringArray(R.array.verse_1); 
     String[] versTwo = res.getStringArray(R.array.verse_2); 
    } 
    else { 
     Resources res = getResources(); 
     String[] versOne = res.getStringArray(R.array.verse_1); 
     String[] versTwo = res.getStringArray(R.array.verse_2); 
     OneFragment.setText(versOne[0]); //here is ERROR 
    } 
} 

} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 
    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 


    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

OneFragment(其它片段看起來是一樣的):

package app.voet.kalenderversemitseneca.Fragments; 

import android.content.res.Resources; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import app.voet.kalenderversemitseneca.R; 


public class OneFragment extends Fragment{ 
    private TextView textView1; 
    public OneFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    //return inflater.inflate(R.layout.fragment_one, container, false); 
    View view = inflater.inflate(R.layout.fragment_one, null); 
    textView1 = (TextView)view.findViewById(R.id.TV1); 
    return view; 
} 

public void setText(String text) { 
    textView1.setText(text); 
} 
} 

fragment_one.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_width="match_parent" 
android:layout_height="match_parent" 
tools:context="app.voet.kalenderversemitseneca.Fragments.OneFragment"> 

<TextView 
android:id="@+id/TV1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textSize="20dp" 
android:textStyle="bold" 
android:layout_centerInParent="true" 
android:layout_marginTop="5dp" 
android:layout_marginLeft="5dp" 
android:layout_marginRight="5dp" 
android:layout_marginBottom="5dp" 
android:text="Hello" /> 

</RelativeLayout> 

如果你找到任何我能提高別人的事,請告訴我,因爲我還處於起步階段,學習:)

謝謝

萊昂

回答

0

其添加到ViewPagerAdapter:

public Fragment getFragment(int i) { 
    return mFragmentList.get(i); 
} 

並將setText()替換爲:

public void setText(boolean translationOn){ 
if (translationOn){ 
    Resources res = getResources(); 
    String[] versOne = res.getStringArray(R.array.verse_1); 
    String[] versTwo = res.getStringArray(R.array.verse_2); 
} 
else { 
    Resources res = getResources(); 
    String[] versOne = res.getStringArray(R.array.verse_1); 
    String[] versTwo = res.getStringArray(R.array.verse_2); 
    ((OneFragment)adapter.getFragment(0)).setText(versOne[0]); 
} 
} 

並替換setupView尋呼機本:

ViewPagerAdapter adapter; 
private void setupViewPager(ViewPager viewPager) { 
adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
adapter.addFragment(new OneFragment(), "ONE"); 
adapter.addFragment(new TwoFragment(), "TWO"); 
adapter.addFragment(new ThreeFragment(), "THREE"); 
adapter.addFragment(new FourFragment(), "FOUR"); 
adapter.addFragment(new FiveFragment(), "FIVE"); 
adapter.addFragment(new SixFragment(), "SIX"); 
adapter.addFragment(new SevenFragment(), "SEVEN"); 
viewPager.setAdapter(adapter); 

}

+0

所以,我已經將它應用於我的所有片段。文本確實發生了變化,但我認識到有三個錯誤/錯誤:1.它僅在滾動瀏覽所有片段時才起作用。然後它只改變當前片段和前一片段的文本。 3.當我然後去其他片段,他們顯示沒有文字... –

0

好吧,我可能會做的就是把串在你像這樣的主要活動......

public String getVers(){ 
if (translationOn){ 
    Resources res = getResources(); 
    String[] versOne = res.getStringArray(R.array.verse_1); 
    String[] versTwo = res.getStringArray(R.array.verse_2); 
}else { 
    Resources res = getResources(); 
    String[] versOne = res.getStringArray(R.array.verse_1); 
    String[] versTwo = res.getStringArray(R.array.verse_2); 
    String vers = versOne[0]; 
} 
    return vers; 
} 

然後在你的片段活動我會添加

 final String vers = ((MainActivity) getActivity()).getVers(); 
if (vers == null) { 
textView1.setText(vers); 
} 

可以將這些最後4行代碼添加到您的所有片段,然後在打開時,如果切換開關確實設置了文本,他們textviews將顯示它。在您的片段

public interface ITextLitener{ 
    public void setText(String text); 

}

0

您可以使用界面活性片段 之間的通信,例如

public class FR1 extends Fragment implements ITextListener{ 

@Override 
setText(String text) 
{ 
txt.setText(text); 

} 
} 

從活動美其名曰:

((instance of your fragment)your interface).setText(your text); 

舉例:

((Frag1)ITextListener).setText("hi"); 
+0

嗨,我試過這個,但如果我添加此行:'((OneFragment)ITextListener).setText(「HI」);'我得到此錯誤:預期表達式(ITextListener帶紅色下劃線)。 –