-1

我试图将数据从我的“Training2.java”类传递到我的“Training1.java类”,并且在执行此操作时应用程序崩溃。 “训练2”是一项活动,“训练1”是一个片段,我认为这个问题源于此。我得到错误应用程序崩溃同时将数据从活动传递到片段

“android.content.ActivityNotFoundException:无法找到显式活动类{com.hardingsoftware.hrcfitness/com.hardingsoftware.hrcfitness.Training1};你是否在你的AndroidManifest.xml中声明了这个活动?” ,

所以我几乎可以肯定这是问题所在。任何想法如何将数据传递给Training 1,同时使用intent维护我的设置?

培训1:

package com.hardingsoftware.hrcfitness; 

/** 
* Created by John on 2/7/16. 
*/ 
import android.support.v4.app.Fragment; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Training1 extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener{ 

    private ListView lwItems; 
    private Button btnChangeItems; 

    private String DEFAULT_ITEMS_VALUES_STRING = "Item 1; Item 2"; 
    private String customItemString; 
    private static SharedPreferences preferenceItems; 

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



     View rootView = inflater.inflate(R.layout.content_main, container, false); 

     Button btnChangeItems = (Button) rootView.findViewById(R.id.btnChangeItems); 

     btnChangeItems.setOnClickListener(this); 

     lwItems = (ListView) rootView.findViewById(R.id.lwItems); 
     preferenceItems = getActivity().getSharedPreferences("items", 0); 

     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     Bundle setItemsIntent = getActivity().getIntent().getExtras(); 
     if (setItemsIntent != null){ 
      customItemString = getActivity().getIntent().getExtras().getString("customValues"); 
     } 

     String[] items; 
     String preferenceItemsString = preferenceItems.getString("customValues", null); 
     if(preferenceItemsString != null){ 
      items = getSplitAndTrim(preferenceItemsString); 
     }else{ 
      items = getSplitAndTrim(DEFAULT_ITEMS_VALUES_STRING); 
     } 

     ArrayAdapter<String> arrayAdapter = 
       new ArrayAdapter<>(getActivity(), android.R.layout.simple_expandable_list_item_1, items); 
     lwItems.setAdapter(arrayAdapter); 
     lwItems.setOnItemClickListener(this); 

    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if(customItemString != null){ 
      putStringInPreferences("customValues", customItemString); 
     } 
    } 

    @Override 
    public void onClick(View v) { 

     Intent intent = new Intent(getActivity(), Training2.class); 
     startActivity(intent); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     String textOfItem = String.valueOf(((TextView) view).getText()); 
     Toast.makeText(getActivity(), textOfItem, Toast.LENGTH_SHORT).show(); 
    } 

    public static void putStringInPreferences(String key, String customItemString) { 
     SharedPreferences.Editor editor = preferenceItems.edit(); 
     editor.putString(key, customItemString); 
     editor.commit(); 
    } 

    @NonNull 
    private String[] getSplitAndTrim(String preferenceItemsString) { 
     return preferenceItemsString.trim().split("\\s*;\\s*"); 
    } 
} 

培训2:

package com.hardingsoftware.hrcfitness; 

/** 
* Created by John on 2/7/16. 
*/ 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Training2 extends AppCompatActivity implements View.OnClickListener{ 
    EditText etInputValues; 
    Button btnSetVales; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_set_items); 
     etInputValues = (EditText) findViewById(R.id.etInputValues); 
     btnSetVales = (Button) findViewById(R.id.btnSetValues); 
     btnSetVales.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     String etInputValuesText = String.valueOf(etInputValues.getText()); 
     if (!etInputValuesText.equals("")){ 
      Training1.putStringInPreferences("customValues", etInputValuesText); 
      Intent intent = new Intent(this, Training1.class); 
      intent.putExtra("customValues", etInputValuesText); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      intent.putExtra("EXIT", true); 
      startActivity(intent); 



     }else{ 
      Toast.makeText(Training2.this, "No Values Added!", Toast.LENGTH_SHORT).show(); 
     } 



    } 
} 

回答

0

您需要加载Training1与FragmentTransaction片段,而不是你做的一样,如果它是一个活动...

在主活动布局你可能有一些地方加载这样的Framgments :

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1"/> 

然后你Training1片段连接到这个容器的使用:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.content, new Training1(), "TRAINING_1_TAG"); 
ft.commit(); 

现在从它的标签让你的片段,从那里设置变量s和/或触发某种方法:

Training1 training1Frament = (Training1) getSupportFragmentManager().findFragmentByTag("TRAINING_1_TAG"); 
training1Frament.myPublicVar = "my variable"; 
training1Frament.myPublicMethod(); 
+0

将我的额外“customValues”与这个传递? –

+0

我完成了代码示例,从您的主机活动中传递数据或调用方法到您的片段中...... – JBA

+1

@JBA您应该使用'setArguments'将数据传递到'Fragment',以便状态仍然存在如果片段由框架恢复。请参阅http://stackoverflow.com/a/11397212/1105073和http://developer.android.com/reference/android/app/Fragment.html#setArguments(android.os.Bundle) – Eggman87

1

Training1是Fragment,而不是一个Activity。 A Fragment住在一项活动中。您不使用意图显示片段,而是需要使用FragmentManager将片段添加到活动中。请参阅Android文档中的this指南。

如果您只是想让Training1成为不同的屏幕(基本上是一个活动),您可以通过扩展AppCompatActivity而不是Fragment并将其添加到您的Android清单中来使Training1成为活动。如果你这样做了,那么你可以通过一个明确的Intent导航到那个活动。