2016-11-20 1 views
-1

내 목표 :하나의 조각에서 다른 조각으로 ratingBar의 FLOAT 값 전달

안녕하세요 여러분, 저는 모든 것을 자세히 설명하기 위해 최선을 다할 것입니다.

두 개의 단편과 하나의 주요 활동이 있습니다. 내가 성취하고자하는 것은 사용자가 등급 표시 줄에서 등급을 선택하게하십시오. 그 등급을 변수에 저장하고 그 값을 두 번째 조각에 표시하십시오.

IntentBundle을 사용하여이 기능을 시도했지만 실행시 내 응용 프로그램이 작동하지 않습니다. 이 앱에는 두 개의 탭이있는 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 
+0

내 답변에서 언급했듯이 번들이있는 대신 새로운 조각을 사용하고 있습니다. –

답변

2

interface를 사용하여 상호 작용을 구현해야 OneFragment에서 TwoFragment에 데이터를 전달하려면 당신이 바로 그렇게 간단 Communicating with Other Fragments이 링크를 따라

HeadlinesFragment as fragment one

ArticleFragment as fragment

two onListItemClick is your onRatingChanged

생각하고 적절한으로 int 값을 대체하지 않으 float 매개 변수 및 앱 충돌은 항상 로그 캣을 게시 할 경우 방법

+1

"stingextra"대신 "floatextra"를 사용하십시오 ... 그냥 내 대답을 upvote하고 서둘러 시도하지 말고 인용하십시오. 그것을 복사하기 위해서는 존재하지 않는 typo를 참조하는 당혹감을 덜어줍니다. Watch 나는 유효한 문제를 찾아내는 데 필요한 upvote도 줄 것이다. – Sam

+0

i.getStringExtra를 i.getFloatExtra로 변경하면 다음과 같은 오류가 발생합니다. ::: getFloatExtra (String, float) intent는 문자열에 적용 할 수 없습니다. –

+0

@ TanavSharma 당신은 put을 사용하고 적절한 장소에서 float을 추가로 가져와야합니다. –

1

however it crashes my app on launch.

, 그것은 바로 모든 사람 를 알려줍니다 어디서 오류가 발생합니다.


아마 여러 오류가 있지만 처음부터 하나의 논리 오류가 표시됩니다.

당신은 float으로 값 저장 :

float val = rating; 
... 
i.putExtra("star",val); 

을하지만 당신은 그것을 검색 할 .getStringExtra()를 사용하려고 ...

String vals = i.getStringExtra("star"); 

valfloat하지 않는 String 기억이 적절한 게터 사용하는 대신
getFloatExtra()합니다. 여기에 다른 답변에 추가

float val = i.getFloatExtra("star"); 
+0

logcat, 내가 그걸 잊어 버렸어 : ( –

+0

안녕하세요, logcat을 추가했습니다. –

+0

@TanavSharma Pavneet이 올바른 길을 인도하고 있습니다 .logcat은'TwoFragment.onCreateView()'의'getArguments()'가'null'을 리턴하므로 'null' 객체에'.getString ("stars")'을 사용할 수 없습니다. 실제로'TwoFragment'에'float' 값을 전달해야합니다. – Sam

0

는보다 유연한 방법을, SharedPreferences 또는 staic 변수를 사용해보십시오. 이 기능을 사용하면 즉시 활동을 시작하는 대신 변수를 저장하고 필요할 때 검색 할 수 있습니다.