2016-11-10 135 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带红色下划线)。 –