내 목표 :하나의 조각에서 다른 조각으로 ratingBar의 FLOAT 값 전달
안녕하세요 여러분, 저는 모든 것을 자세히 설명하기 위해 최선을 다할 것입니다.
두 개의 단편과 하나의 주요 활동이 있습니다. 내가 성취하고자하는 것은 사용자가 등급 표시 줄에서 등급을 선택하게하십시오. 그 등급을 변수에 저장하고 그 값을 두 번째 조각에 표시하십시오.
Intent
과 Bundle
을 사용하여이 기능을 시도했지만 실행시 내 응용 프로그램이 작동하지 않습니다. 이 앱에는 두 개의 탭이있는 tabLayout
이 있습니다. 탭 하나는 OneFargment.java
에 연결되고 탭 2는 TwoFragment.java
에 연결됩니다. 여기서는 인터페이스를 사용하는 방법이 작동하지 않을 것이라고 생각합니다. 각 프래그먼트마다 다른 레이아웃이 있기 때문입니다. 도움이나 안내가 크게 감사 할 것입니다. 여러분이 XML 파일에 대한 코드를 게시해야한다면 알려주십시오.
I am confused as how to recieve the values in my main activity, it seems that I need to define an ID to a fragment, but I dont have an id for fragment as each fragment has its own seperate layout file.
다음은 내 모든 파일에 대한 코드입니다.
OneFragment.java
package tanav.sharma;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
public class OneFragment extends Fragment {
OnFragmentSendVal vSendVal;
private RatingBar ratingBar;
private TextView txtRatingValue;
public interface OnFragmentSendVal{
public void onSentVal(float value);
}
public OneFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try{
vSendVal = (OnFragmentSendVal)activity;
}catch (ClassCastException e){
throw new ClassCastException(activity.toString() + " must implement OnFragmentSendVal");
}
}
@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
View view = inflater.inflate(R.layout.tanav_image,
container, false);
addListenerOnRatingBar(view);
return view;
}
public void addListenerOnRatingBar(View v) {
ratingBar = (RatingBar) v.findViewById(R.id.ratingBar);
txtRatingValue = (TextView) v.findViewById(R.id.value);
//if rating value is changed,
//display the current rating value in the result (textview) automatically
ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
float val = rating;
vSendVal.onSentVal(val);
//txtRatingValue.setText(String.valueOf(rating));
}
});
}
}
TanavActivity.java
package tanav.sharma;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.content.DialogInterface;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.TextView;
public class TanavActivity extends AppCompatActivity implements OneFragment.OnFragmentSendVal {
RatingBar rb;
TextView result;
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.ic_action_pro,
R.drawable.ic_action_web
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tanav);
toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/**
* This button is responsible for taking the user back
* to the main activity. Preventing the user from pressing
* the back key multiple times.
*/
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager)findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
int count_image = 0;
int count_web = 0;
@Override
public void onTabSelected(TabLayout.Tab tab) {
int position = tab.getPosition();
if(position == 0){
count_image = count_image + 1;
TextView counter = (TextView) findViewById(R.id.counter);
counter.setText(Integer.toString(count_image));
}else if(position == 1){
//count_web = count_web + 1;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
count_image = count_image + 1;
TextView counter = (TextView) findViewById(R.id.counter);
counter.setText(Integer.toString(count_image));
}
});
}
private void setupTabIcons(){
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
}
private void setupViewPager(ViewPager viewPager){
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new OneFragment(), getApplicationContext().getString(R.string.tanav));
adapter.addFragment(new TwoFragment(), getApplicationContext().getString(R.string.sharma));
viewPager.setAdapter(adapter);
}
@Override
public void onSentVal(float value) {
}
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);
}
}
/**
* This function is responsible for prompting the user with a dialog box,
* once the hit the back key on the app. Asking for confirmation if they,
* really want to exit the app. If user selects Yes, the app will quit.
* If the user selects cancel, the app will continue to run.
*/
@Override
public void onBackPressed() {
CharSequence exit = getApplicationContext().getString(R.string.exit);
CharSequence exit_message = getApplicationContext().getString(R.string.exit_message);
new AlertDialog.Builder(this)
.setTitle(exit)
.setMessage(exit_message)
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
TanavActivity.super.onBackPressed();
}
}).create().show();
}
}
TwoFragment.java
package tanav.sharma;
import android.content.Intent;
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;
public class TwoFragment extends Fragment {
TextView lblResult;
public TwoFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.sharma_web, container, false);
String starRatings = getArguments().getString("stars");
lblResult = (TextView)view.findViewById(R.id.lblResult);
lblResult.setText(starRatings);
return view;
}
}
로그 캣 :
11-20 12:12:16.128 19867-19867/tanav.sharma E/AndroidRuntime: FATAL EXCEPTION: main
Process: tanav.sharma, PID: 19867
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at tanav.sharma.TwoFragment.onCreateView(TwoFragment.java:31)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1638)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1240)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1088)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700)
at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
at android.view.View.measure(View.java:20221)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3111)
at android.view.View.measure(View.java:20221)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2687)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1640)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1932)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1528)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7564)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:686)
at android.view.Choreographer.doFrame(Choreographer.java:622)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7331)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.i
내 답변에서 언급했듯이 번들이있는 대신 새로운 조각을 사용하고 있습니다. –