【问题标题】:Why I am not getting datas in other activity from previous activity using interface in android为什么我没有使用 android 中的界面从以前的活动中获取其他活动中的数据
【发布时间】:2019-08-14 10:10:24
【问题描述】:

虽然我知道我们可以使用 get 和 put extras 来传递给其他活动,但我只是在尝试是否可以通过接口存储和获取数据。我存储了数据,但在其他活动中,我无法获取数据。

下面是我累了。

interface PassDataToOtherActivity {
    public void passData(String data);

    @SuppressLint("NewApi")
    default void setData(String s) {

    }



public class MainActivity extends AppCompatActivity implements PassDataToOtherActivity {
    private TextView textView;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.first_text);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
        textView.setText("Hello Test");
        setData(textView.getText().toString());
        passData(textView.getText().toString());


    }

    @Override
    public void passData(String data) {
//override methods
    }
}



public class SecondActivity extends AppCompatActivity implements PassDataToOtherActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        textView = findViewById(R.id.textView_2);
    }

    @Override
    public void passData(String data) { //why i am not getting the datas from previous activity?
        textView.setText(data);

    }

    @Override
    public void setData(String data) { //why I am not able to get the datas from previous activity?
        textView.setText(data);

    }
}

【问题讨论】:

    标签: java android java-8 interface


    【解决方案1】:

    在一个类上实现接口并不意味着它会自动获得调用。

    例如A 类只有在 B 类的情况下才能将数据传递给 B 类:

    • 实现接口。
    • 一个类拥有一个指向 B 类对象的接口实例

    在你的例子中。 SecondActivity 的实例不是由您创建的,因此不可能。

    【讨论】:

      【解决方案2】:

      不使用 put extra 和 getExtra,你可以通过 Singleton 类来实现。

      public class DataHolder {
      
          private static final DataHolder instance = new DataHolder();
      
          public static DataHolder getInstance() {
              return instance;
          }
      
          private String data;
          public String getData() {
              return data;
          }
      
          public void setData(String data) {
              this.data = data;
          }
      }
      

      现在您可以设置数据并获取其他类中的数据。在这里,我没有使用任何其他 android 提供的 api,例如 Preference 或 Intent 组件来传递和获取数据。

       public class MainActivity extends AppCompatActivity {
          private TextView textView;
          private Button button;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              textView = findViewById(R.id.first_text);
              button = findViewById(R.id.button);
              textView.setText("Hello Test");
              button.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      DataHolder.getInstance().setData(textView.getText().toString());
                      Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                      startActivity(intent);
                  }
              });
      
      
      
          }
      }
      
      
      
      public class SecondActivity extends AppCompatActivity {
          private TextView textView;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_second);
              textView = findViewById(R.id.textView_2);
              textView.setText(DataHolder.getInstance().getData());
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        你应该在意图上使用额外的东西,这样会更有效率。 从 MainActivity 传递数据:

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putExtra("TEXT_TO_PASS", "Hello Test");
        startActivity(intent);
        

        然后从 SecondActivity 中检索它:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            String dataPassed = getIntent().getStringExtra("TEXT_TO_PASS");
        }
        

        探索更多关于在活动之间传递数据here

        【讨论】:

        • 我已经在第一行指定了,我不想使用 put 和 getExtras。如果我能用,那接口有什么用呢?
        • 那么在这种情况下接口是没用的。接口是一个契约,它强制你的两个活动都实现这些方法,但它们在任何时候都没有连接。基本上,接口用于确保类具有相同的行为和方法,它不存储数据。如果你想绕过额外的,你可以创建一个处理程序类,它只不过是一个java类,你会影响属性中的一些数据。
        • I don't want to use put and getExtras 运气不好,因为你应该使用intent extras,否则你的应用会出现你没想到的崩溃If I can use that, then what's the use of interface then?你添加的界面是没有意义的,因为你将无法获得对另一个活动的引用,所以答案是“我不知道,但你不应该这样做”。
        • 我们可以通过单例类实现@CorentinHoudayer
        • @Shadow 你说得对,如果我不得不这样做,我会去的。
        【解决方案4】:

        不,不能通过接口在 Activity 之间传递数据。

        原因是,要使用接口,必须像我们在 onAttach() 方法中在两个片段之间传递数据时那样初始化接口对象。

        但在 Activity 的情况下,无法传递上下文进行初始化。

            class MainActivity extends AppCompatActivity implements myInterface {
                  onCreate(){
                    android.support.v4.app.FragmentTransaction fragmentTransaction = 
                    fragmentManager.beginTransaction();
                      if (fragment != null) {
                        fragmentTransaction.replace(R.id.content_frame, fragment);
                        fragmentTransaction.addToBackStack(fragmentTag);
                        fragmentTransaction.commit();
                    }
              }
        
              @Override
              public void onChange(String s) {
              // your retrieved code
              }
            }
        
        
            class MyFragment extends Fragment {
        
             private MyInterface interf ;
             @Override
                public void onAttach(Context context) {
                    super.onAttach(context);
                    interf = (myInterface) context;
                }
                onActivityCreated(){
                 interf.onChange("Hello");
                }
        
            }
        
          public interface myInterface {
            void onChange();
          }
        

        【讨论】:

        • 这在技术上是可能的,但它会涉及静态,而且通常是不安全的。
        猜你喜欢
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多