2017-02-17 1 views
0

수많은 글을 살펴 봤지만이 글을 찾아 낼 수 없습니다. ChangeFont 활동을 통해 (기본 활동에있는) textview의 font/color/size를 변경하면 주요 활동의 textview가 사라지는 것처럼 보입니다. 여기Android Studio TextView가 활동 변경 후 사라짐

여기에 ChangeMessageActivity.java

package assignment02.csc214.assignment04; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class ChangeMessageActivity extends Activity implements MyFragment.MessageChangeListener { 

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

    MyFragment fragment = new MyFragment(); 
    fragment.setArguments(getIntent().getExtras()); 
    getFragmentManager() 
      .beginTransaction() 
      .replace(R.id.change_message_activity, fragment) 
      .commit(); 
} 
@Override 
public void messageChanged(CharSequence message) { 
    Intent data = new Intent(); 
    data.putExtra(MainActivity.KEY_MESSAGE, message); 
    setResult(RESULT_OK, data); 
    finish(); 
} 

@Override 
public void messageCanceled() { 
    setResult(RESULT_CANCELED); 
    finish(); 
} 
} 

그리고 마지막으로 MyFragment.java (전용 인 MainActivity.java 여기

package assignment02.csc214.assignment04; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.graphics.Typeface; 
import android.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.SpannableString; 
import android.text.TextWatcher; 
import android.text.style.UnderlineSpan; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

// keys to pass data in to ChangeFontActivity 
static final String KEY_BOLD = "assignment02.csc214.assignment04.BOLD"; 
static final String KEY_ITALIC = "assignment02.csc214.assignment04.ITALIC"; 
static final String KEY_UNDERLINE = "assignment02.csc214.assignment04.UNDERLINED"; 

static final String KEY_BLUE = "assignment02.csc214.assignment04.BLUE"; 
static final String KEY_RED = "assignment02.csc214.assignment04.RED"; 
static final String KEY_YELLOW = "assignment02.csc214.assignment04.YELLOW"; 

static final String KEY_20SP = "assignment02.csc214.assignment04.20SP"; 
static final String KEY_30SP = "assignment02.csc214.assignment04.30SP"; 
static final String KEY_40SP = "assignment02.csc214.assignment04.40SP"; 

static final String KEY_MESSAGE = "Enter message here."; 

private TextView mMainTV; 

private boolean mUnderlined = false; 

private int mBlue = 0xff0000ff; 
private int mRed = 0xffff0000; 
private int mYellow = 0xffffff00; 

private int m20 = 20; 
private int m30 = 30; 
private int m40 = 40; 

private static final int REQUEST_FONT = 2; 
private static final int REQUEST_MESSAGE = 0; 

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

    mMainTV = (TextView)findViewById(R.id.tv_main_activity); 

    Button fontButton = (Button)findViewById(R.id.fontButton); 

    if (savedInstanceState != null){ 
     String message = savedInstanceState.getString(KEY_MESSAGE); 
     mMainTV.setText(message); 
    } 
    fontButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, ChangeFontActivity.class); 

      // passing data in 
      // font data 
      Typeface typeface = mMainTV.getTypeface(); 
      intent.putExtra(KEY_BOLD, typeface.isBold()); 
      intent.putExtra(KEY_ITALIC, typeface.isItalic()); 
      intent.putExtra(KEY_UNDERLINE, mUnderlined); 

      // color data 
      intent.putExtra(KEY_BLUE, mBlue); 
      intent.putExtra(KEY_RED, mRed); 
      intent.putExtra(KEY_YELLOW, mYellow); 

      // size data 
      intent.putExtra(KEY_20SP, m20); 
      intent.putExtra(KEY_30SP, m30); 
      intent.putExtra(KEY_40SP, m40); 
      startActivityForResult(intent, REQUEST_FONT); 
     } 
    }); 
    Button messageButton = (Button)findViewById(R.id.changeMessageButton); 
    messageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, ChangeMessageActivity.class); 
      intent.putExtra(KEY_MESSAGE, mMainTV.getText().toString()); 
      startActivityForResult(intent, REQUEST_MESSAGE); 
     } 
    }); 
} 
@Override 
protected void onSaveInstanceState(Bundle outState){ 
    super.onSaveInstanceState(outState); 
    // use bundle to save information 
    outState.putString(KEY_MESSAGE, mMainTV.getText().toString()); 
} 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState){ 
    super.onRestoreInstanceState(savedInstanceState); 
    String message = savedInstanceState.getString(KEY_MESSAGE); 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode != RESULT_CANCELED) { 
     boolean bold = data.getBooleanExtra(KEY_BOLD, false); 
     boolean italic = data.getBooleanExtra(KEY_ITALIC, false); 
     boolean underlined = data.getBooleanExtra(KEY_UNDERLINE, false); 
     updateFont(bold, italic, underlined); 

     boolean blue = data.getBooleanExtra(KEY_BLUE, false); 
     boolean red = data.getBooleanExtra(KEY_RED, false); 
     boolean yellow = data.getBooleanExtra(KEY_YELLOW, false); 
     updateColor(blue, red, yellow); 

     boolean text20 = data.getBooleanExtra(KEY_20SP, false); 
     boolean text30 = data.getBooleanExtra(KEY_30SP, false); 
     boolean text40 = data.getBooleanExtra(KEY_40SP, false); 
     updateSize(text20, text30, text40); 
    } 
    if (resultCode != RESULT_CANCELED){ 
     CharSequence message = data.getCharSequenceExtra(KEY_MESSAGE); 
     mMainTV.setText(message); 
    } 
} 
protected void updateSize(boolean text20, boolean text30, boolean text40){ 
    if (text20) 
     mMainTV.setTextSize(m20); 
    else if (text30) 
     mMainTV.setTextSize(m30); 
    else if (text40) 
     mMainTV.setTextSize(m40); 

} 
protected void updateColor(boolean blue, boolean red, boolean yellow){ 
    if (blue) 
     mMainTV.setTextColor(mBlue); 
    else if (red) 
     mMainTV.setTextColor(mRed); 
    else if (yellow) 
     mMainTV.setTextColor(mYellow); 
} 
protected void updateFont(boolean bold, boolean italic, boolean underline){ 
    Typeface typeface = mMainTV.getTypeface(); 
    int style = Typeface.NORMAL; 
    if(bold && italic) { 
     style = Typeface.BOLD_ITALIC; 
    } 
    else if(bold) { 
     style = Typeface.BOLD; 
    } 
    else if(italic) { 
     style = Typeface.ITALIC; 
    } 
    Typeface newTypeface = Typeface.create(typeface, style); 
    mMainTV.setTypeface(newTypeface); 

    if(underline) { 
     CharSequence message = mMainTV.getText(); 
     SpannableString content = new SpannableString(message); 
     content.setSpan(new UnderlineSpan(), 0, content.length(), 0); 
     mMainTV.setText(content); 
     mUnderlined = true; 
    } 
    else { 
     // reset whole message 
     mMainTV.setText(mMainTV.getText().toString()); 
     mUnderlined = false; 
    } 
    } 
} 

package assignment02.csc214.assignment04; 

    import android.content.Intent; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.CheckBox; 

public class ChangeFontActivity extends AppCompatActivity { 
     private CheckBox mBoldBox; 
     private CheckBox mItalicBox; 
     private CheckBox mUnderlineBox; 

     private CheckBox mBlue; 
     private CheckBox mRed; 
     private CheckBox mYellow; 

     private CheckBox m20; 
     private CheckBox m30; 
     private CheckBox m40; 

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

    Intent intent = getIntent(); 

    // get the appropriate checkboxes and set data from MainActivity 
    mBoldBox = (CheckBox)findViewById(R.id.check_bold); 
    mBoldBox.setChecked(intent.getBooleanExtra(MainActivity.KEY_BOLD, false)); 

    mItalicBox = (CheckBox)findViewById(R.id.check_italic); 
    mItalicBox.setChecked(intent.getBooleanExtra(MainActivity.KEY_ITALIC, false)); 

    mUnderlineBox = (CheckBox)findViewById(R.id.check_underline); 
    mUnderlineBox.setChecked(intent.getBooleanExtra(MainActivity.KEY_UNDERLINE, false)); 

    mBlue = (CheckBox)findViewById(R.id.color_blue); 
    mBlue.setChecked(intent.getBooleanExtra(MainActivity.KEY_BLUE, false)); 

    mRed = (CheckBox)findViewById(R.id.color_red); 
    mRed.setChecked(intent.getBooleanExtra(MainActivity.KEY_RED, false)); 

    mYellow = (CheckBox)findViewById(R.id.color_yellow); 
    mYellow.setChecked(intent.getBooleanExtra(MainActivity.KEY_YELLOW, false)); 

    m20 = (CheckBox)findViewById(R.id.sp_20); 
    m20.setChecked(intent.getBooleanExtra(MainActivity.KEY_20SP, false)); 

    m30 = (CheckBox)findViewById(R.id.sp_30); 
    m30.setChecked(intent.getBooleanExtra(MainActivity.KEY_30SP, false)); 

    m40 = (CheckBox)findViewById(R.id.sp_40); 
    m40.setChecked(intent.getBooleanExtra(MainActivity.KEY_40SP, false)); 

    Button OKButton = (Button)findViewById(R.id.button_ok); 
    OKButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent data = new Intent(); 
      data.putExtra(MainActivity.KEY_BOLD, mBoldBox.isChecked()); 
      data.putExtra(MainActivity.KEY_ITALIC, mItalicBox.isChecked()); 
      data.putExtra(MainActivity.KEY_UNDERLINE, mUnderlineBox.isChecked()); 

      data.putExtra(MainActivity.KEY_BLUE, mBlue.isChecked()); 
      data.putExtra(MainActivity.KEY_RED, mRed.isChecked()); 
      data.putExtra(MainActivity.KEY_YELLOW, mYellow.isChecked()); 

      data.putExtra(MainActivity.KEY_20SP, m20.isChecked()); 
      data.putExtra(MainActivity.KEY_30SP, m30.isChecked()); 
      data.putExtra(MainActivity.KEY_40SP, m40.isChecked()); 

      setResult(RESULT_OK, data); 
      finish(); 
     } 
    }); 
    Button cancelButton = (Button)findViewById(R.id.button_cancel); 
    cancelButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setResult(RESULT_CANCELED); 
      finish(); 
     } 
    }); 
    } 
} 

ChangeFontActivity.java

이다 조각을 사용하여 changeMessage 활동이 실행 됨)

package assignment02.csc214.assignment04; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 

public class MyFragment extends Fragment { 

public interface MessageChangeListener { 
    public void messageChanged(CharSequence message); 
    public void messageCanceled(); 
} 
private MessageChangeListener mMessageChangeListener; 

public MyFragment() { 
    // Required empty public constructor 
} 
@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    mMessageChangeListener = (MessageChangeListener)context; 
} 

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

    View view = inflater.inflate(R.layout.fragment_my, container, false); 

    final EditText editText = (EditText)view.findViewById(R.id.editText); 
    editText.setText(getArguments().getString(MainActivity.KEY_MESSAGE)); 
    Button okButton = (Button)view.findViewById(R.id.activity3_okButton); 
    okButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mMessageChangeListener.messageChanged(editText.getText()); 
     } 
    }); 

    Button cancelButton = (Button)view.findViewById(R.id.activity3_cancelButton); 
    cancelButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mMessageChangeListener.messageCanceled(); 
     } 
    }); 
    return view; 
    } 
} 

고맙습니다.

답변

0

onActivityResult() 메서드는 두 가지를 구분하지 않고 두 가지 다른 자식 활동 (하나는 메시지를 반환하고 다른 하나는 응답하지 않음)의 응답을 처리하려고합니다.

귀하의 MainActivity은 두 가지 다른 활동 중 하나, 즉 글꼴 변경 및 메시지 변경 중 하나를 시작합니다. 각 활동을 시작하면 요청 코드 (REQUEST_MESSAGE 또는 REQUEST_FONT)를 제공합니다.

자식 작업이 결과를 반환하면 요청 코드가 함께 반환됩니다. 이렇게하면 어떤 활동이 결과를 반환하는지 알 수 있고 그 결과로 무엇을 할 것인지 결정할 수 있습니다. 요청 코드가 REQUEST_MESSAGE 인 경우에만 메시지를 업데이트해야하며 요청 코드가 REQUEST_FONT 인 경우 글꼴을 업데이트해야합니다.

여러분이 작성한대로 onActivityResult()은 사용자가 취소 버튼을 누르지 않는 한 항상 양쪽 모두를 시도합니다. 결과를 반환하는 하위 작업과 관계없이 if 문 중 두 문은 true가됩니다. 즉, ChangeFontActivity이 결과를 반환하는 경우에도 표시되는 메시지를 변경하려고합니다 (결과에는 메시지가 포함되지 않습니다). 메시지는 null이므로 텍스트가 화면에서 "사라집니다".

관련 문제