2016-12-02 6 views
-1

Ich habe eine MainActivity, die ein Fragment (ReadStory) aufruft. ReadStory verfügt über einen ViewPager, der einen PagerAdapter verwendet. Die Seite hat ein Bild und eine TextView am unteren Rand. (Dieses Beispiel zeigt nur den TextView)Android: Text in einem PagerAdapter ändern

All dies funktioniert gut.

Es gibt eine Anforderung, dass, wenn der Benutzer TextView berührt/klickt, verschiedene Wörter rot hervorgehoben werden. Dies funktioniert auch gut.

Das Problem, das ich habe, ist, dass der Text (mit roten Markierungen) auf dem nächsten Bildschirm angezeigt wird, nicht auf dem aktuell sichtbaren Bildschirm. Ich habe einen onClickListener auf der TextView gesetzt, der die relevanten Teile auf rot setzt und dann den Text auf der TextView setzt.

Der ViewPager lädt den aktuellen Bildschirm sowie die vorherigen und nächsten Bildschirme. Die TextView ist an den "nextScreen" angehängt.

Wie ändere ich TextView auf dem aktuellen Bildschirm?

Ich habe nach der Antwort für mehrere Tage gesucht, aber ich kann nicht scheinen, eine Antwort zu finden. Jede Hilfe wäre willkommen.

Mein Code - MainActivity

import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends AppCompatActivity { 

Button myButton; 
ReadStory RS; 

// ********************************************************************************************* 

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

    myButton = (Button) findViewById(R.id.button); 
    myButton.setOnClickListener(textViewClickListener); 

} 

// ********************************************************************************************* 

private View.OnClickListener textViewClickListener = new View.OnClickListener() { 
    public void onClick(View v) { 

     int[] mStory_resources = {R.string.S1P0, R.string.S1P1, R.string.S1P2, R.string.S1P3, R.string.S1P4, R.string.S1P5, R.string.S1P6, R.string.S1P7, 
       R.string.S1P8, R.string.S1P9, R.string.S1P10, R.string.S1P11}; 
     int mStoryWords = R.string.S1words; 

     RS = new ReadStory(); 
     Bundle args = new Bundle(); 
     args.putIntArray("Story", mStory_resources); 
     args.putInt("storyWords", mStoryWords); 
     RS.setArguments(args); 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.addToBackStack("readStory"); 
     ft.replace(R.id.activity_main, RS); 
     ft.commit(); 

    } 
}; 
// ********************************************************************************************* 
} 

ReadStory

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 

public class ReadStory extends Fragment { 

static String currentString = ""; 
static String newString = ""; 
private static final String story = "Story"; 
private static final String storyWords = "storyWords"; 
private int[] mStory_resources; 
private int mStory_words; 

ViewPager viewPager; 
CustomSwipeAdapter adapter; 

public ReadStory() { 
    // Required empty public constructor 
} 

// ********************************************************************************************* 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mStory_resources = getArguments().getIntArray(story); 
     mStory_words = getArguments().getInt(storyWords); 
    } 

} 

// ********************************************************************************************* 

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

    final RelativeLayout parent = (RelativeLayout) inflater.inflate(R.layout.read_story, container, false); 
    viewPager = (ViewPager) parent.findViewById(R.id.view_pager); 
    adapter = new CustomSwipeAdapter(getActivity()); 

    adapter.story_resources = mStory_resources; 
    adapter.story_words = mStory_words; 
    viewPager.setAdapter(adapter); 

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      currentString = getString(mStory_resources[position]); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

    return parent; 

} 

// ********************************************************************************************* 

} 

PagerAdapter

import android.content.Context; 
import android.os.Build; 
import android.support.v4.view.PagerAdapter; 
import android.text.Html; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class CustomSwipeAdapter extends PagerAdapter{ 

int[] story_resources; 
int story_words; 
private TextView textView; 
private Context ctx; 

CustomSwipeAdapter(Context ctx) 
{ 
    this.ctx = ctx; 
} 

// ********************************************************************************************* 

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

// ********************************************************************************************* 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return (view==object); 
} 

// ********************************************************************************************* 

@SuppressWarnings("deprecation")      // Put here as setText is deprecated as of API 16 - Jelly_bean 
@Override 
public Object instantiateItem(ViewGroup container, int position) { 

    LayoutInflater layoutInflater; 
    layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View item_view = layoutInflater.inflate(R.layout.swipe_layout,container,false); 
    textView = (TextView) item_view.findViewById(R.id.image_count); 
    textView.setText(story_resources[position]); 
    textView.setOnClickListener(textViewClickListener); 

    container.addView(item_view); 
    return item_view; 
} 

// ********************************************************************************************* 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 

    container.removeView((RelativeLayout)object); 

} 

// ********************************************************************************************* 

@SuppressWarnings("deprecation")      // Put here as fromHtml is deprecated as of API 24 - N 

private View.OnClickListener textViewClickListener = new View.OnClickListener() { 
    public void onClick(View v) { 

     String patternString = "\\b(" + ctx.getString(story_words) + ")\\b"; 
     Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE); 
     Matcher matcher = pattern.matcher(ReadStory.currentString); 
     StringBuffer bufStr = new StringBuffer(); 

     while (matcher.find()) { 
      String rep = matcher.group(); 
      matcher.appendReplacement(bufStr, "<font color='#EE0000'>" + rep + "</font>"); 
     } 
     matcher.appendTail(bufStr); 
     ReadStory.newString = bufStr.toString(); 

     int sdk = android.os.Build.VERSION.SDK_INT; 
     if(sdk >= Build.VERSION_CODES.N) { 
      textView.setText(Html.fromHtml(ReadStory.newString)); 
     } else { 
      textView.setText(Html.fromHtml(ReadStory.newString)); 
     } 

     Toast.makeText(ctx, "Clicked", Toast.LENGTH_LONG).show(); 
    } 
}; 

// ********************************************************************************************* 


} 

Antwort

1

Mit

((TextView)v).setText(Html.fromHtml(ReadStory.newString)); 

statt

textView.setText(Html.fromHtml(ReadStory.newString)); 

Es gibt Referenz Problem mit Textview-Objekt es anhand der Tagesordnung besteht.

Verwandte Themen